#include <bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--){
int n;
cin >> n;
string s;
cin >> s;
int a, b, first_one, last_one;
for(a = 0; a<n; ++a){
if(s[a] == '1') break;
}
first_one = a;
for(b = n-1; b>=a; --b){
if(s[b] == '1') break;
}
last_one = b;
priority_queue <int> pq;
pq.push(0);
int cnt = 0;
for(int i = a+1; i<=b; ++i){
if(s[i] == '0') cnt++;
else if(cnt != 0){
pq.push(cnt);
cnt = 0;
}
}
int begin = first_one;
int end = n-1-last_one;
bool one;
long long ans = 0;
int days = 0;
if(begin == n){
cout << 0 << "\n";
continue;
}
while(begin-days >= 1 || end-days >= 1 || pq.top()-2*days >= 1){
int maks = pq.top() - 2*days;
if(maks != 1){
--maks;
one = false;
}else{
one = true;
}
if((maks > begin-days+1 && maks > end-days+1) || (begin-days<=0 && end-days<=0)){
if(one){
ans += maks;
}else{
ans += maks;
days++;
}
pq.pop();
}else if(begin >= end){
ans += begin-days;
begin = 0;
}else if(end > begin){
ans += end-days;
end = 0;
}
++days;
}
cout << n-ans << "\n";
}
}
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 | #include <bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--){ int n; cin >> n; string s; cin >> s; int a, b, first_one, last_one; for(a = 0; a<n; ++a){ if(s[a] == '1') break; } first_one = a; for(b = n-1; b>=a; --b){ if(s[b] == '1') break; } last_one = b; priority_queue <int> pq; pq.push(0); int cnt = 0; for(int i = a+1; i<=b; ++i){ if(s[i] == '0') cnt++; else if(cnt != 0){ pq.push(cnt); cnt = 0; } } int begin = first_one; int end = n-1-last_one; bool one; long long ans = 0; int days = 0; if(begin == n){ cout << 0 << "\n"; continue; } while(begin-days >= 1 || end-days >= 1 || pq.top()-2*days >= 1){ int maks = pq.top() - 2*days; if(maks != 1){ --maks; one = false; }else{ one = true; } if((maks > begin-days+1 && maks > end-days+1) || (begin-days<=0 && end-days<=0)){ if(one){ ans += maks; }else{ ans += maks; days++; } pq.pop(); }else if(begin >= end){ ans += begin-days; begin = 0; }else if(end > begin){ ans += end-days; end = 0; } ++days; } cout << n-ans << "\n"; } } |
English