#include <cstdio> #include <algorithm> #include <functional> using namespace std; #define MAXN 200000 char datadata[MAXN]; typedef struct interval { int lgt; int ends; } inter; inter inters[MAXN]; inline int val(const inter &A) { return A.lgt * (3 - A.ends); } bool operator< (const inter &A, const inter &B) { return val(A) > val(B); } int main() { int T; scanf("%d", &T); for (int ttt = 0; ttt < T; ++ttt) { int N; scanf("%d\n", &N); scanf("%s\n", datadata); int cur_inter = 0; int n_inters = 1; inters[0].lgt = inters[0].ends = 0; for (int i = 0; i < N; ++i) { if (cur_inter >= 0) { if (datadata[i] == '0') { inters[cur_inter].lgt += 1; } else { inters[cur_inter].ends += 1; cur_inter = -1; } } else { if (datadata[i] == '0') { cur_inter = n_inters; inters[cur_inter].lgt = 1; inters[cur_inter].ends = 1; n_inters += 1; } } } sort(&inters[0], &inters[n_inters]); int cround = 0; int cscore = 0; for (int i = 0; i < n_inters; ++i) { int cval = inters[i].lgt - inters[i].ends * cround; if (inters[i].ends == 2 && cval > 1) cval -= 1; if (cval > 0) cscore += cval; cround += inters[i].ends; } printf("%d\n", N - cscore); } 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 | #include <cstdio> #include <algorithm> #include <functional> using namespace std; #define MAXN 200000 char datadata[MAXN]; typedef struct interval { int lgt; int ends; } inter; inter inters[MAXN]; inline int val(const inter &A) { return A.lgt * (3 - A.ends); } bool operator< (const inter &A, const inter &B) { return val(A) > val(B); } int main() { int T; scanf("%d", &T); for (int ttt = 0; ttt < T; ++ttt) { int N; scanf("%d\n", &N); scanf("%s\n", datadata); int cur_inter = 0; int n_inters = 1; inters[0].lgt = inters[0].ends = 0; for (int i = 0; i < N; ++i) { if (cur_inter >= 0) { if (datadata[i] == '0') { inters[cur_inter].lgt += 1; } else { inters[cur_inter].ends += 1; cur_inter = -1; } } else { if (datadata[i] == '0') { cur_inter = n_inters; inters[cur_inter].lgt = 1; inters[cur_inter].ends = 1; n_inters += 1; } } } sort(&inters[0], &inters[n_inters]); int cround = 0; int cscore = 0; for (int i = 0; i < n_inters; ++i) { int cval = inters[i].lgt - inters[i].ends * cround; if (inters[i].ends == 2 && cval > 1) cval -= 1; if (cval > 0) cscore += cval; cround += inters[i].ends; } printf("%d\n", N - cscore); } return 0; } |