#include <iostream> #include <vector> #include <cstring> #include <algorithm> using namespace std; int main(){ int t; scanf("%d", &t); while (t--){ int n; string s; cin >> n; cin >> s; vector<int> t1, t2; int i1 = s.find_first_of("1"); if (i1 == string::npos){ cout << "0" << "\n"; continue; } t2.push_back(i1); int i2 = s.find_last_of("1"); t2.push_back(n - 1 - i2); int last = i1; for (int i = i1 + 1; i <= i2; i++){ if (s[i] == '1'){ //if (i - last - 1 == 9) //cout << "ww " << i << "\n"; t1.push_back(i - last - 1); last = i; } } sort(t1.begin(), t1.end(), greater<int>()); sort(t2.begin(), t2.end(), greater<int>()); int day = 0; int res = 0; int superday = 0; int res2 = 0, res3 = 0, res4 = 0; while (t1.size() > day / 2){ int l = t1[day / 2]; //cout << "ss " << l << " " << res << "\n"; if (l - 2 * day == 5){ res2 = res + 1; int day2 = day; res2 += max(0, t2[0] - day2); day2++; res2 += max(0, t2[1] - day2); day2++; } if (l - 2 * day <= 4){ if (l - 2 * day <= 0){ break; } res4 = res; int day4 = day; res4 += max(0, t2[0] - day4); day4++; res4 += max(0, t2[1] - day4); if ((l - 2 * day >= 3) && (l - 2 * day <= 4)){ int day3 = day; res3 = res + 1; res3 += t2[0] - day3; day3 += 2; res3 += max(0, t2[1] - day3); day3++; } if (l - 2 * day == 4){ res += 3; day += 2; } else if (l - 2 * day == 3){ res += 2; day += 2; } else if (l - 2 * day == 2){ res += 1; day++; } else { res += 1; day++; } break; } res += l - 2 * day - 1; day += 2; } for (int i = 0; i < t2.size(); i++){ res += max(0, t2[i] - day); day++; } //cout << n - res << " " << n - res2 << " " << n - res3 << "\n"; cout << min(min(n - res, n - res2), min(n - res3, n - res4)) << "\n"; } }
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 | #include <iostream> #include <vector> #include <cstring> #include <algorithm> using namespace std; int main(){ int t; scanf("%d", &t); while (t--){ int n; string s; cin >> n; cin >> s; vector<int> t1, t2; int i1 = s.find_first_of("1"); if (i1 == string::npos){ cout << "0" << "\n"; continue; } t2.push_back(i1); int i2 = s.find_last_of("1"); t2.push_back(n - 1 - i2); int last = i1; for (int i = i1 + 1; i <= i2; i++){ if (s[i] == '1'){ //if (i - last - 1 == 9) //cout << "ww " << i << "\n"; t1.push_back(i - last - 1); last = i; } } sort(t1.begin(), t1.end(), greater<int>()); sort(t2.begin(), t2.end(), greater<int>()); int day = 0; int res = 0; int superday = 0; int res2 = 0, res3 = 0, res4 = 0; while (t1.size() > day / 2){ int l = t1[day / 2]; //cout << "ss " << l << " " << res << "\n"; if (l - 2 * day == 5){ res2 = res + 1; int day2 = day; res2 += max(0, t2[0] - day2); day2++; res2 += max(0, t2[1] - day2); day2++; } if (l - 2 * day <= 4){ if (l - 2 * day <= 0){ break; } res4 = res; int day4 = day; res4 += max(0, t2[0] - day4); day4++; res4 += max(0, t2[1] - day4); if ((l - 2 * day >= 3) && (l - 2 * day <= 4)){ int day3 = day; res3 = res + 1; res3 += t2[0] - day3; day3 += 2; res3 += max(0, t2[1] - day3); day3++; } if (l - 2 * day == 4){ res += 3; day += 2; } else if (l - 2 * day == 3){ res += 2; day += 2; } else if (l - 2 * day == 2){ res += 1; day++; } else { res += 1; day++; } break; } res += l - 2 * day - 1; day += 2; } for (int i = 0; i < t2.size(); i++){ res += max(0, t2[i] - day); day++; } //cout << n - res << " " << n - res2 << " " << n - res3 << "\n"; cout << min(min(n - res, n - res2), min(n - res3, n - res4)) << "\n"; } } |