#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()); } } |
English