#include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(0); int n, zera, i, l, p, roznica, t, temp; string s; cin >> t; while(t--){ cin >> n >> s; s = '2' + s + '2'; vector<pair<int,int> > luki; i = 1; zera = 0; while(i <= n && s[i]=='0') { zera++; i++; } if(zera == n) { cout << 0 << endl; continue; } if (zera > 0) luki.push_back(make_pair(2*zera,1)); l = i; i = n; zera = 0; while(i > l && s[i]=='0') { zera++; i--; } if (zera > 0) luki.push_back(make_pair(2*zera,1)); p = i; zera = 0; for(i = l; i <= p; i++) { if(s[i] =='0') zera++; else { if(zera >0) luki.push_back(make_pair(zera,0)); zera = 0; } } sort(luki.rbegin(),luki.rend()); //for(i = 0; i < luki.size();i++) cout << luki[i].first <<" "<<luki[i].second << endl; zera = 0; roznica = 0; for(i = 0; i < luki.size();i++){ if(luki[i].second == 0) { temp = luki[i].first - roznica; if(temp < 1) break; zera += 1; temp -= 2; temp = max(temp, 0); roznica += 4; } else{ temp = luki[i].first - roznica; temp /= 2; if(temp < 1) break; roznica += 2; } zera += temp; //cout << zera << endl; } cout << n - zera << 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 | #include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(0); int n, zera, i, l, p, roznica, t, temp; string s; cin >> t; while(t--){ cin >> n >> s; s = '2' + s + '2'; vector<pair<int,int> > luki; i = 1; zera = 0; while(i <= n && s[i]=='0') { zera++; i++; } if(zera == n) { cout << 0 << endl; continue; } if (zera > 0) luki.push_back(make_pair(2*zera,1)); l = i; i = n; zera = 0; while(i > l && s[i]=='0') { zera++; i--; } if (zera > 0) luki.push_back(make_pair(2*zera,1)); p = i; zera = 0; for(i = l; i <= p; i++) { if(s[i] =='0') zera++; else { if(zera >0) luki.push_back(make_pair(zera,0)); zera = 0; } } sort(luki.rbegin(),luki.rend()); //for(i = 0; i < luki.size();i++) cout << luki[i].first <<" "<<luki[i].second << endl; zera = 0; roznica = 0; for(i = 0; i < luki.size();i++){ if(luki[i].second == 0) { temp = luki[i].first - roznica; if(temp < 1) break; zera += 1; temp -= 2; temp = max(temp, 0); roznica += 4; } else{ temp = luki[i].first - roznica; temp /= 2; if(temp < 1) break; roznica += 2; } zera += temp; //cout << zera << endl; } cout << n - zera << endl; } return 0; } |