#include <iostream> #include<algorithm> #include <vector> using namespace std; struct trio { int usuwanki, dugosici; }; bool repare(trio a, trio b) { if(a.dugosici==b.dugosici) return a.usuwanki<b.usuwanki; return a.dugosici>b.dugosici; } vector<trio> tab; int main() { ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); string pop, piewsza,p; int n, m, odp; trio lek; cin>>n; for(int i=0; i<n; i++) { cin>>m; odp=0; cin>>p; lek.dugosici=0; lek.usuwanki=2; if(p[0]=='0') lek.dugosici++; else odp++; pop=p[0]; piewsza=p[0]; for(int a=1; a<m; a++) { if(p[a]=='0') lek.dugosici++; else { odp++; if(pop == "1") continue; else { tab.push_back(lek); lek.dugosici=0; } } pop=p[a]; } if(odp==0) { cout<<0; continue; } if(lek.dugosici!=0) tab.push_back(lek); if(piewsza=="0") { tab[0].usuwanki--; tab[0].dugosici=tab[0].dugosici*2; } if(p[p.size()-1]=='0') { tab[tab.size()-1].dugosici=tab[tab.size()-1].dugosici*2; tab[tab.size()-1].usuwanki--; } sort(tab.begin() , tab.end() , repare); for(int a=0; a<tab.size(); a++) cout<<tab[a].dugosici<<" "<<tab[a].usuwanki<<"\n"; int dni=0; for(int a=0; a<tab.size(); a++) { if(tab[a].usuwanki==1) { if(tab[a].dugosici-dni<=0) { odp=odp+tab[a].dugosici; } else { odp=odp+dni; } dni++; } else { if(tab[a].dugosici-(dni*2)<=0) { odp=odp+tab[a].dugosici; } else { if(tab[a].dugosici-(dni*2)>1) odp++; odp=odp+(dni*2); } dni=dni+2; } } cout<<odp<<"\n"; tab.erase(tab.begin() , tab.end()); } }
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 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <iostream> #include<algorithm> #include <vector> using namespace std; struct trio { int usuwanki, dugosici; }; bool repare(trio a, trio b) { if(a.dugosici==b.dugosici) return a.usuwanki<b.usuwanki; return a.dugosici>b.dugosici; } vector<trio> tab; int main() { ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); string pop, piewsza,p; int n, m, odp; trio lek; cin>>n; for(int i=0; i<n; i++) { cin>>m; odp=0; cin>>p; lek.dugosici=0; lek.usuwanki=2; if(p[0]=='0') lek.dugosici++; else odp++; pop=p[0]; piewsza=p[0]; for(int a=1; a<m; a++) { if(p[a]=='0') lek.dugosici++; else { odp++; if(pop == "1") continue; else { tab.push_back(lek); lek.dugosici=0; } } pop=p[a]; } if(odp==0) { cout<<0; continue; } if(lek.dugosici!=0) tab.push_back(lek); if(piewsza=="0") { tab[0].usuwanki--; tab[0].dugosici=tab[0].dugosici*2; } if(p[p.size()-1]=='0') { tab[tab.size()-1].dugosici=tab[tab.size()-1].dugosici*2; tab[tab.size()-1].usuwanki--; } sort(tab.begin() , tab.end() , repare); for(int a=0; a<tab.size(); a++) cout<<tab[a].dugosici<<" "<<tab[a].usuwanki<<"\n"; int dni=0; for(int a=0; a<tab.size(); a++) { if(tab[a].usuwanki==1) { if(tab[a].dugosici-dni<=0) { odp=odp+tab[a].dugosici; } else { odp=odp+dni; } dni++; } else { if(tab[a].dugosici-(dni*2)<=0) { odp=odp+tab[a].dugosici; } else { if(tab[a].dugosici-(dni*2)>1) odp++; odp=odp+(dni*2); } dni=dni+2; } } cout<<odp<<"\n"; tab.erase(tab.begin() , tab.end()); } } |