#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <algorithm>
int double_holes[100 * 1000];
int single_holes[2];
void do_test() {
int n;
int base_sick_cities = 0;
assert(1 == scanf("%d", &n));
int last_pos = -1;
int n_single = 0;
int n_double = 0;
for (int i = 0; i < n; i++) {
int c = getchar();
if (c == '1') {
base_sick_cities++;
if (last_pos == -1 && i > 0) {
single_holes[n_single++] = i;
} else if (last_pos + 1 != i) {
double_holes[n_double++] = i - last_pos - 1;
}
last_pos = i;
} else if (c != '0') {
i--; // Skip whitespace
}
}
if (last_pos != -1 && last_pos + 1 != n) {
single_holes[n_single++] = n - last_pos - 1;
}
if (base_sick_cities == 0) {
puts("0");
return;
}
std::sort(single_holes, single_holes + n_single);
std::sort(double_holes, double_holes + n_double);
int saved_cities = 0;
int elapsed = 0;
auto process_single_hole = [&] {
const int remaining_now = std::max(0, single_holes[--n_single] - elapsed);
if (remaining_now > 0) {
saved_cities += remaining_now;
elapsed++;
}
};
auto process_double_hole = [&] {
int remaining_now = std::max(0, double_holes[--n_double] - 2 * elapsed);
if (remaining_now > 2) {
saved_cities += remaining_now - 1;
elapsed += 2;
} else if (remaining_now > 0) {
saved_cities++;
elapsed++;
}
};
while (n_double > 0 && n_single > 0) {
const int worth_single = std::max(0, single_holes[n_single - 1] - elapsed);
const int worth_double = std::max(0, double_holes[n_double - 1] - 2 * elapsed);
if (2 * worth_single >= worth_double) {
process_single_hole();
} else {
process_double_hole();
}
}
while (n_single > 0) {
process_single_hole();
}
while (n_double > 0) {
process_double_hole();
}
printf("%d\n", n - saved_cities);
}
int main() {
int t;
assert(1 == scanf("%d", &t));
while (t --> 0) {
do_test();
}
return 0;
}
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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include <cstdio> #include <cstdlib> #include <cassert> #include <algorithm> int double_holes[100 * 1000]; int single_holes[2]; void do_test() { int n; int base_sick_cities = 0; assert(1 == scanf("%d", &n)); int last_pos = -1; int n_single = 0; int n_double = 0; for (int i = 0; i < n; i++) { int c = getchar(); if (c == '1') { base_sick_cities++; if (last_pos == -1 && i > 0) { single_holes[n_single++] = i; } else if (last_pos + 1 != i) { double_holes[n_double++] = i - last_pos - 1; } last_pos = i; } else if (c != '0') { i--; // Skip whitespace } } if (last_pos != -1 && last_pos + 1 != n) { single_holes[n_single++] = n - last_pos - 1; } if (base_sick_cities == 0) { puts("0"); return; } std::sort(single_holes, single_holes + n_single); std::sort(double_holes, double_holes + n_double); int saved_cities = 0; int elapsed = 0; auto process_single_hole = [&] { const int remaining_now = std::max(0, single_holes[--n_single] - elapsed); if (remaining_now > 0) { saved_cities += remaining_now; elapsed++; } }; auto process_double_hole = [&] { int remaining_now = std::max(0, double_holes[--n_double] - 2 * elapsed); if (remaining_now > 2) { saved_cities += remaining_now - 1; elapsed += 2; } else if (remaining_now > 0) { saved_cities++; elapsed++; } }; while (n_double > 0 && n_single > 0) { const int worth_single = std::max(0, single_holes[n_single - 1] - elapsed); const int worth_double = std::max(0, double_holes[n_double - 1] - 2 * elapsed); if (2 * worth_single >= worth_double) { process_single_hole(); } else { process_double_hole(); } } while (n_single > 0) { process_single_hole(); } while (n_double > 0) { process_double_hole(); } printf("%d\n", n - saved_cities); } int main() { int t; assert(1 == scanf("%d", &t)); while (t --> 0) { do_test(); } return 0; } |
English