#include <bits/stdc++.h>
#define DEBUG(x) cout << '>' << #x << ':' << x << endl;
#define fi first
#define se second
#define ll long long
#define ld long double
#define pb push_back
#define vi vector<int>
#define MAXN 100001
using namespace std;
struct intervals {
vector<int> O;
ll total = 0;
ll sure = 0;
void push(int v, int s) {
total += v;
sure += s;
O.pb(v);
}
ll gain() {
int n = O.size();
ll loss = (n - 1) * n / 2;
return total - loss + sure;
}
};
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
char c;
int left = -1;
int right = -1;
int current = 0;
vector<int> V;
V.pb(0);
for (int i = 0; i < n; i++) {
cin >> c;
if (c == '0')
current += 1;
else {
if (left == -1) {
left = current;
} else {
V.pb(current);
}
current = 0;
}
}
if (current > 0) {
right = current;
}
sort(V.rbegin(), V.rend());
intervals I;
ll res = 0;
int j = 0;
int time = 0;
while (j < V.size()) {
int current_val = V[j] - 2 * time;
int left_val = left - time;
int right_val = right - time;
//cout<<current_val<<" "<<left_val<<" "<<right_val<<endl;
if (current_val >0 && current_val >= left_val && current_val >= right_val) {
I.push(max(current_val-2, 0), 1);
j++;
time++;
} else if (left_val > 0 && left_val >= current_val && left_val >= right_val) {
I.push(left_val, 0);
left = -1;
} else if (right_val > 0 && right_val >= current_val && right_val >= left_val) {
I.push(right_val, 0);
right = -1;
} else if(current_val <= 0) {
break;
}
res = max(res, I.gain());
}
cout<<n-res<<endl;
}
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 101 102 103 104 105 | #include <bits/stdc++.h> #define DEBUG(x) cout << '>' << #x << ':' << x << endl; #define fi first #define se second #define ll long long #define ld long double #define pb push_back #define vi vector<int> #define MAXN 100001 using namespace std; struct intervals { vector<int> O; ll total = 0; ll sure = 0; void push(int v, int s) { total += v; sure += s; O.pb(v); } ll gain() { int n = O.size(); ll loss = (n - 1) * n / 2; return total - loss + sure; } }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; while (t--) { int n; cin >> n; char c; int left = -1; int right = -1; int current = 0; vector<int> V; V.pb(0); for (int i = 0; i < n; i++) { cin >> c; if (c == '0') current += 1; else { if (left == -1) { left = current; } else { V.pb(current); } current = 0; } } if (current > 0) { right = current; } sort(V.rbegin(), V.rend()); intervals I; ll res = 0; int j = 0; int time = 0; while (j < V.size()) { int current_val = V[j] - 2 * time; int left_val = left - time; int right_val = right - time; //cout<<current_val<<" "<<left_val<<" "<<right_val<<endl; if (current_val >0 && current_val >= left_val && current_val >= right_val) { I.push(max(current_val-2, 0), 1); j++; time++; } else if (left_val > 0 && left_val >= current_val && left_val >= right_val) { I.push(left_val, 0); left = -1; } else if (right_val > 0 && right_val >= current_val && right_val >= left_val) { I.push(right_val, 0); right = -1; } else if(current_val <= 0) { break; } res = max(res, I.gain()); } cout<<n-res<<endl; } return 0; } |
English