#include <iostream> #include <vector> #include <algorithm> int main() { int t; scanf("%d", &t); for (int i = 0; i < t; i++) { std::vector<int> health_intervals; int edge_interval1, edge_interval2; edge_interval1 = -1; int n; scanf("%d\n", &n); health_intervals.reserve(n); int counter = 0; for (int i = 0; i < n; i ++) { char state; scanf("%c", &state); if (state == '0') counter++; else { if (edge_interval1 == -1) edge_interval1 = counter; else if (counter > 0) health_intervals.push_back(counter); counter = 0; } } edge_interval2 = counter; std::sort(health_intervals.begin(), health_intervals.end(), std::greater<int>()); int number_of_cities_saved = 0; int max_interval_index = 0; for (int i = 0; i < n; i++) { if ((max_interval_index >= health_intervals.size()) || ((edge_interval2 - i > 0 || edge_interval1 - i > 0 ) && (edge_interval1 - i + 2 >= health_intervals[max_interval_index] - 2 * i || edge_interval2 - i + 2 >= health_intervals[max_interval_index] - 2 * i))) { if (edge_interval1 > edge_interval2) { number_of_cities_saved += std::max(edge_interval1 - i, 0); edge_interval1 = 0; } else { number_of_cities_saved += std::max(edge_interval2 - i, 0); edge_interval2 = 0; } } else { number_of_cities_saved += std::max(health_intervals[max_interval_index] - 2 * i, 0); if (health_intervals[max_interval_index] - 2 * i > 1) { number_of_cities_saved--; if (health_intervals[max_interval_index] - 2 * i > 2) i++; } max_interval_index++; } } printf("%d\n", n - number_of_cities_saved); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <iostream> #include <vector> #include <algorithm> int main() { int t; scanf("%d", &t); for (int i = 0; i < t; i++) { std::vector<int> health_intervals; int edge_interval1, edge_interval2; edge_interval1 = -1; int n; scanf("%d\n", &n); health_intervals.reserve(n); int counter = 0; for (int i = 0; i < n; i ++) { char state; scanf("%c", &state); if (state == '0') counter++; else { if (edge_interval1 == -1) edge_interval1 = counter; else if (counter > 0) health_intervals.push_back(counter); counter = 0; } } edge_interval2 = counter; std::sort(health_intervals.begin(), health_intervals.end(), std::greater<int>()); int number_of_cities_saved = 0; int max_interval_index = 0; for (int i = 0; i < n; i++) { if ((max_interval_index >= health_intervals.size()) || ((edge_interval2 - i > 0 || edge_interval1 - i > 0 ) && (edge_interval1 - i + 2 >= health_intervals[max_interval_index] - 2 * i || edge_interval2 - i + 2 >= health_intervals[max_interval_index] - 2 * i))) { if (edge_interval1 > edge_interval2) { number_of_cities_saved += std::max(edge_interval1 - i, 0); edge_interval1 = 0; } else { number_of_cities_saved += std::max(edge_interval2 - i, 0); edge_interval2 = 0; } } else { number_of_cities_saved += std::max(health_intervals[max_interval_index] - 2 * i, 0); if (health_intervals[max_interval_index] - 2 * i > 1) { number_of_cities_saved--; if (health_intervals[max_interval_index] - 2 * i > 2) i++; } max_interval_index++; } } printf("%d\n", n - number_of_cities_saved); } } |