#include<bits/stdc++.h> using namespace std; //#define int long long int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin>>t; while(t--){ int n; cin>>n; string s; cin>>s; vector<int>inds; int ctr=0; vector<int>holes; int lengththishole=0; for(int i=0;i<n;i++){ if(s[i]=='1'){ ctr++; inds.push_back(i); holes.push_back(lengththishole); lengththishole=0; } else{ lengththishole++; } } holes.push_back(lengththishole); if(ctr==0){ cout<<0<<'\n'; continue; } if(ctr==1&&((inds[0]==0)||(inds[0]==n-1))){ cout<<1<<'\n'; continue; } if(ctr==1){ cout<<min(n,2)<<'\n'; continue; } /*int at1=0; int firsthole=0; while(s[at1]!='1'){ at1++; } firsthole=at1; int at=n-1; while(s[at]!='1'){ at--; } int lasthole=n-1-at; */ vector<int>noextremes; for(int i=1;i<holes.size()-1;i++){ noextremes.push_back(holes[i]); } sort(noextremes.begin(),noextremes.end(),greater<int>()); //nie bierzemy bocznych int saved1=0; int at=0; int time=0; while(at<noextremes.size()){ //cout<<saved1<<" "; int toadd=noextremes[at]-time*2-1; if(toadd==0)saved1++; if(toadd<=0)break; saved1+=toadd; time+=2; at++; } //bierzemy lewo lub prawo (wieksze); int saved2=0; saved2+=max(holes[0],holes[holes.size()-1]); at=0; time=1; while(at<noextremes.size()){ int toadd=noextremes[at]-time*2-1; if(toadd==0)saved2++; if(toadd<=0)break; saved2+=toadd; time+=2; at++; } //bierzemy oba int saved3=0; saved3+=holes[0]+holes[holes.size()-1]-1; at=0; time=2; while(at<noextremes.size()){ int toadd=noextremes[at]-time*2-1; if(toadd==0)saved3++; if(toadd<=0)break; saved3+=toadd; time+=2; at++; } cout<<n-max(saved1,max(saved2,saved3))<<'\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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include<bits/stdc++.h> using namespace std; //#define int long long int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin>>t; while(t--){ int n; cin>>n; string s; cin>>s; vector<int>inds; int ctr=0; vector<int>holes; int lengththishole=0; for(int i=0;i<n;i++){ if(s[i]=='1'){ ctr++; inds.push_back(i); holes.push_back(lengththishole); lengththishole=0; } else{ lengththishole++; } } holes.push_back(lengththishole); if(ctr==0){ cout<<0<<'\n'; continue; } if(ctr==1&&((inds[0]==0)||(inds[0]==n-1))){ cout<<1<<'\n'; continue; } if(ctr==1){ cout<<min(n,2)<<'\n'; continue; } /*int at1=0; int firsthole=0; while(s[at1]!='1'){ at1++; } firsthole=at1; int at=n-1; while(s[at]!='1'){ at--; } int lasthole=n-1-at; */ vector<int>noextremes; for(int i=1;i<holes.size()-1;i++){ noextremes.push_back(holes[i]); } sort(noextremes.begin(),noextremes.end(),greater<int>()); //nie bierzemy bocznych int saved1=0; int at=0; int time=0; while(at<noextremes.size()){ //cout<<saved1<<" "; int toadd=noextremes[at]-time*2-1; if(toadd==0)saved1++; if(toadd<=0)break; saved1+=toadd; time+=2; at++; } //bierzemy lewo lub prawo (wieksze); int saved2=0; saved2+=max(holes[0],holes[holes.size()-1]); at=0; time=1; while(at<noextremes.size()){ int toadd=noextremes[at]-time*2-1; if(toadd==0)saved2++; if(toadd<=0)break; saved2+=toadd; time+=2; at++; } //bierzemy oba int saved3=0; saved3+=holes[0]+holes[holes.size()-1]-1; at=0; time=2; while(at<noextremes.size()){ int toadd=noextremes[at]-time*2-1; if(toadd==0)saved3++; if(toadd<=0)break; saved3+=toadd; time+=2; at++; } cout<<n-max(saved1,max(saved2,saved3))<<'\n'; } } |