#include<iostream> #include<vector> #include<algorithm> #include<queue> using namespace std; const int INF=999999999; int main() { ios_base::sync_with_stdio(0); int n; cin>>n; while(n--) { int t; string ciag=""; cin>>t; cin>>ciag; vector<int> c2V,c1V; queue<int> c2; queue<int> c1; int dl=0; for(int i=0 ; i<t ; i++) { if(ciag[i]=='0') { dl++; } else if(dl>0) { if(c1V.empty() && ciag[0]=='0') c1V.push_back(dl); else c2V.push_back(dl); dl =0; } //cout<<"I "<<i<<" dl "<<dl<<endl; } c1V.push_back(dl); sort(c2V.begin(),c2V.end(),greater<int>()); sort(c1V.begin(),c1V.end(),greater<int>()); for(auto i : c2V) { c2.push(i);} for(auto i : c1V) {c1.push(i);} c2.push(-INF); c1.push(-INF); c2V.clear(); c1V.clear(); int uratowano =0; int dni_uplynelo =0; while(true) { //cout<<"C2 front"<<c2.front()<<endl; //cout<<"C1 front"<<c1.front()<<endl; if(c1.front()-dni_uplynelo>=c2.front()-dni_uplynelo*2-2 && c1.front()>dni_uplynelo) { uratowano+=c1.front()-dni_uplynelo; dni_uplynelo++; c1.pop(); } else if(c2.front()>dni_uplynelo*2){ if(c2.front()-dni_uplynelo*2>2) { uratowano+=c2.front()-dni_uplynelo*2-1; dni_uplynelo+=2; } else { uratowano+=1; dni_uplynelo+=1; } c2.pop(); } else break; } //cout<<uratowano<<endl; //cout<<dni_uplynelo<<endl; cout<<t-uratowano<<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 | #include<iostream> #include<vector> #include<algorithm> #include<queue> using namespace std; const int INF=999999999; int main() { ios_base::sync_with_stdio(0); int n; cin>>n; while(n--) { int t; string ciag=""; cin>>t; cin>>ciag; vector<int> c2V,c1V; queue<int> c2; queue<int> c1; int dl=0; for(int i=0 ; i<t ; i++) { if(ciag[i]=='0') { dl++; } else if(dl>0) { if(c1V.empty() && ciag[0]=='0') c1V.push_back(dl); else c2V.push_back(dl); dl =0; } //cout<<"I "<<i<<" dl "<<dl<<endl; } c1V.push_back(dl); sort(c2V.begin(),c2V.end(),greater<int>()); sort(c1V.begin(),c1V.end(),greater<int>()); for(auto i : c2V) { c2.push(i);} for(auto i : c1V) {c1.push(i);} c2.push(-INF); c1.push(-INF); c2V.clear(); c1V.clear(); int uratowano =0; int dni_uplynelo =0; while(true) { //cout<<"C2 front"<<c2.front()<<endl; //cout<<"C1 front"<<c1.front()<<endl; if(c1.front()-dni_uplynelo>=c2.front()-dni_uplynelo*2-2 && c1.front()>dni_uplynelo) { uratowano+=c1.front()-dni_uplynelo; dni_uplynelo++; c1.pop(); } else if(c2.front()>dni_uplynelo*2){ if(c2.front()-dni_uplynelo*2>2) { uratowano+=c2.front()-dni_uplynelo*2-1; dni_uplynelo+=2; } else { uratowano+=1; dni_uplynelo+=1; } c2.pop(); } else break; } //cout<<uratowano<<endl; //cout<<dni_uplynelo<<endl; cout<<t-uratowano<<endl; } return 0; } |