#include <iostream>
struct group {
int size;
char type;
};
int main()
{
unsigned t;
std::cin >> t;
for(unsigned _p = 0; _p<t; _p++) {
unsigned n, zar = 0;
std::cin >> n;
group grps[n];
unsigned siz = 0;
char prev = 0, isgroup = 0;
for(unsigned i=0;i<n;i++) {
char tmp;
std::cin >> tmp;
if(tmp == '0') {
if(prev == '1') {
grps[siz].size = 0;
grps[siz++].type = 1;
isgroup = 1;
} else if(!prev) {
grps[siz].size = 0;
grps[siz++].type = 0;
isgroup = 1;
}
} else if(tmp == '1') {
if(prev == '0') {
grps[siz-1].type++;
isgroup = 0;
}
zar++;
}
if(isgroup)
grps[siz-1].size++;
prev = tmp;
}
char flg = 1;
while(flg) {
int maxi = -1;
float max = 0.0f;
flg = 0;
for(unsigned i=0;i<siz;i++) {
if(grps[i].type > 0 && grps[i].size > 0) {
float wsp = (float)(grps[i].size)/(float)grps[i].type;
if(wsp > max) {
maxi = i;
max = wsp;
}
if(grps[i].size < grps[i].type) {
zar += grps[i].size;
grps[i].size = 0;
} else {
grps[i].size -= grps[i].type;
zar += grps[i].type;
}
flg = 1;
}
}
if(maxi != -1)
zar--;
else break;
grps[maxi].type--;
}
std::cout << zar << '\n';
}
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 | #include <iostream> struct group { int size; char type; }; int main() { unsigned t; std::cin >> t; for(unsigned _p = 0; _p<t; _p++) { unsigned n, zar = 0; std::cin >> n; group grps[n]; unsigned siz = 0; char prev = 0, isgroup = 0; for(unsigned i=0;i<n;i++) { char tmp; std::cin >> tmp; if(tmp == '0') { if(prev == '1') { grps[siz].size = 0; grps[siz++].type = 1; isgroup = 1; } else if(!prev) { grps[siz].size = 0; grps[siz++].type = 0; isgroup = 1; } } else if(tmp == '1') { if(prev == '0') { grps[siz-1].type++; isgroup = 0; } zar++; } if(isgroup) grps[siz-1].size++; prev = tmp; } char flg = 1; while(flg) { int maxi = -1; float max = 0.0f; flg = 0; for(unsigned i=0;i<siz;i++) { if(grps[i].type > 0 && grps[i].size > 0) { float wsp = (float)(grps[i].size)/(float)grps[i].type; if(wsp > max) { maxi = i; max = wsp; } if(grps[i].size < grps[i].type) { zar += grps[i].size; grps[i].size = 0; } else { grps[i].size -= grps[i].type; zar += grps[i].type; } flg = 1; } } if(maxi != -1) zar--; else break; grps[maxi].type--; } std::cout << zar << '\n'; } return 0; } |
English