#include "bits/stdc++.h"
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t = *istream_iterator<int>(cin);
while (t--) {
int n = *istream_iterator<int>(cin);
string s = *istream_iterator<string>(cin);
map<int, int, greater<int>> M;
int val = 0, startSegment = distance(s.begin(), find(s.begin(), s.end(), '1')), endSegment = -1;
for (int i = startSegment; i < n; i++) {
if (s[i] == '0')
val++;
else if (val != 0) {
M[val]++;
val = 0;
}
}
if(startSegment == 0) startSegment = -1;
if(val != 0)
endSegment = val;
int time = 0, res = 0;
for (auto &element : M) {
while(element.second) {
int miejsce = element.first - (time * 2);
int mozliwyZysk = ((miejsce == 1) ? 1 : (miejsce - 1));
if(mozliwyZysk <= 0)
break;
if(startSegment - time >= mozliwyZysk - 1 and startSegment >= endSegment and startSegment - time > 0) {
res += startSegment - time;
time += 1;
startSegment = -1;
continue;
}
else if(endSegment - time >= mozliwyZysk - 1 and endSegment - time >= startSegment and endSegment - time > 0) {
res += endSegment - time;
time += 1;
endSegment = -1;
continue;
}
res += mozliwyZysk;
time += (mozliwyZysk == 1) ? 1 : 2;
element.second--;
}
}
if(startSegment >= endSegment and startSegment - time > 0) {
res += startSegment - time;
time += 1;
if(endSegment - time > 0)
res += endSegment - time;
}
else if (endSegment - time > 0) {
res += endSegment - time;
time += 1;
if(startSegment - time > 0)
res += startSegment - time;
}
cout << n - res << "\n";
}
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 | #include "bits/stdc++.h" using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t = *istream_iterator<int>(cin); while (t--) { int n = *istream_iterator<int>(cin); string s = *istream_iterator<string>(cin); map<int, int, greater<int>> M; int val = 0, startSegment = distance(s.begin(), find(s.begin(), s.end(), '1')), endSegment = -1; for (int i = startSegment; i < n; i++) { if (s[i] == '0') val++; else if (val != 0) { M[val]++; val = 0; } } if(startSegment == 0) startSegment = -1; if(val != 0) endSegment = val; int time = 0, res = 0; for (auto &element : M) { while(element.second) { int miejsce = element.first - (time * 2); int mozliwyZysk = ((miejsce == 1) ? 1 : (miejsce - 1)); if(mozliwyZysk <= 0) break; if(startSegment - time >= mozliwyZysk - 1 and startSegment >= endSegment and startSegment - time > 0) { res += startSegment - time; time += 1; startSegment = -1; continue; } else if(endSegment - time >= mozliwyZysk - 1 and endSegment - time >= startSegment and endSegment - time > 0) { res += endSegment - time; time += 1; endSegment = -1; continue; } res += mozliwyZysk; time += (mozliwyZysk == 1) ? 1 : 2; element.second--; } } if(startSegment >= endSegment and startSegment - time > 0) { res += startSegment - time; time += 1; if(endSegment - time > 0) res += endSegment - time; } else if (endSegment - time > 0) { res += endSegment - time; time += 1; if(startSegment - time > 0) res += startSegment - time; } cout << n - res << "\n"; } return 0; } |
English