#include <bits/stdc++.h> #define PB push_back #define ALL(c) (c).begin(), (c).end() #define SIZE(x) (int)(x).size() using namespace std; typedef vector<int> VI; const int N = 1e5 + 10; int n; char s[N+1]; struct Bag { priority_queue<int, VI, greater<>> q; int day = 0, sum = 0; void add(int x) { q.push(x); sum += x; fix(); } void kill() { ++day; fix(); } void fix() { while (!q.empty() && q.top() <= SIZE(q) - 1 + day) { sum -= q.top(); q.pop(); } } int res() { int n = SIZE(q); return sum - n*(n-1)/2 - n*day; } }; int main() { int t; scanf("%d", &t); while (t--) { scanf("%d%s", &n, s); VI one, two; for (int i = 0; i < n; ++i) if (s[i] == '0') { int l = 1; while (i + l < n && s[i + l] == '0') ++l; (l == 1 || i == 0 || i + l == n ? one : two).PB(l); i += l; } Bag bag; for (int x: one) bag.add(x); int r = bag.res(); sort(ALL(two), greater<>()); for (int x: two) { bag.kill(); bag.add(x); r = max(r, bag.res()); } printf("%d\n", n - r); } 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 <bits/stdc++.h> #define PB push_back #define ALL(c) (c).begin(), (c).end() #define SIZE(x) (int)(x).size() using namespace std; typedef vector<int> VI; const int N = 1e5 + 10; int n; char s[N+1]; struct Bag { priority_queue<int, VI, greater<>> q; int day = 0, sum = 0; void add(int x) { q.push(x); sum += x; fix(); } void kill() { ++day; fix(); } void fix() { while (!q.empty() && q.top() <= SIZE(q) - 1 + day) { sum -= q.top(); q.pop(); } } int res() { int n = SIZE(q); return sum - n*(n-1)/2 - n*day; } }; int main() { int t; scanf("%d", &t); while (t--) { scanf("%d%s", &n, s); VI one, two; for (int i = 0; i < n; ++i) if (s[i] == '0') { int l = 1; while (i + l < n && s[i + l] == '0') ++l; (l == 1 || i == 0 || i + l == n ? one : two).PB(l); i += l; } Bag bag; for (int x: one) bag.add(x); int r = bag.res(); sort(ALL(two), greater<>()); for (int x: two) { bag.kill(); bag.add(x); r = max(r, bag.res()); } printf("%d\n", n - r); } return 0; } |