#include<bits/stdc++.h> #define _ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); using namespace std; int t; int main() { _ cin>>t; for(int n, i=1; i<=t; i++){ cin>>n; int wynik=0; bool iff=0; string s; cin>>s; for(int j=0; j<s.size(); j++){ if(s[j]=='1'){ iff=1; break; } } priority_queue<int>q; vector<int>v; int data=0; for(int j=0; j<s.size(); j++){ int x=0; bool start=0; if(j==0) start=1; if(s[j]=='0'){ while(j<s.size() && s[j]=='0'){ j++; x++; } if(start==0 && j!=s.size()){ q.push(x); } v.push_back(x); } if(j<s.size() && s[j]=='1'){ while(j<s.size() && s[j]=='1'){ j++; } } j--; } if(iff==0){ cout<<"0\n"; continue; } int maksi=0; if(v.size()>=2){ for(int i=0; i<v.size(); i++){ if(i==0 && s[0]=='0') continue; if(i==v.size()-1 && s[s.size()-1]=='0') continue; maksi=max(maksi, v[i]); } /*if(s[0]=='0' && s[s.size()-1]=='0'){ q.push(v[0]+v[v.size()-1]); }*/ } //for(int i=0; i<v.size(); i++) cout<<v[i]<<" "; bool u=0, r=0; if(s[0]=='0' && maksi <= 2*v[0]+1){ wynik+=(v[0]); data++; u=1; } if(s[s.size()-1]=='0' && maksi <= 2*(v[v.size()-1])+1){ wynik+=(v[v.size()-1]-data); data++; r=1; } while(!q.empty()){ int y=q.top(); q.pop(); if(y-2*data-1>0){ wynik+=(y-2*data-1); data+=2; continue; } if(y-2*data==1){ wynik++; data++; } } if(u==0 && s[0]=='0' && v[0]-data > 0){ wynik+=(v[0]-data); data++; } if(r==0 && s[s.size()-1]=='0' && v[v.size()-1]-data > 0){ wynik+=(v[v.size()-1]-data); data++; } cout<<n-wynik<<"\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> #define _ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); using namespace std; int t; int main() { _ cin>>t; for(int n, i=1; i<=t; i++){ cin>>n; int wynik=0; bool iff=0; string s; cin>>s; for(int j=0; j<s.size(); j++){ if(s[j]=='1'){ iff=1; break; } } priority_queue<int>q; vector<int>v; int data=0; for(int j=0; j<s.size(); j++){ int x=0; bool start=0; if(j==0) start=1; if(s[j]=='0'){ while(j<s.size() && s[j]=='0'){ j++; x++; } if(start==0 && j!=s.size()){ q.push(x); } v.push_back(x); } if(j<s.size() && s[j]=='1'){ while(j<s.size() && s[j]=='1'){ j++; } } j--; } if(iff==0){ cout<<"0\n"; continue; } int maksi=0; if(v.size()>=2){ for(int i=0; i<v.size(); i++){ if(i==0 && s[0]=='0') continue; if(i==v.size()-1 && s[s.size()-1]=='0') continue; maksi=max(maksi, v[i]); } /*if(s[0]=='0' && s[s.size()-1]=='0'){ q.push(v[0]+v[v.size()-1]); }*/ } //for(int i=0; i<v.size(); i++) cout<<v[i]<<" "; bool u=0, r=0; if(s[0]=='0' && maksi <= 2*v[0]+1){ wynik+=(v[0]); data++; u=1; } if(s[s.size()-1]=='0' && maksi <= 2*(v[v.size()-1])+1){ wynik+=(v[v.size()-1]-data); data++; r=1; } while(!q.empty()){ int y=q.top(); q.pop(); if(y-2*data-1>0){ wynik+=(y-2*data-1); data+=2; continue; } if(y-2*data==1){ wynik++; data++; } } if(u==0 && s[0]=='0' && v[0]-data > 0){ wynik+=(v[0]-data); data++; } if(r==0 && s[s.size()-1]=='0' && v[v.size()-1]-data > 0){ wynik+=(v[v.size()-1]-data); data++; } cout<<n-wynik<<"\n"; } } |