#include <iostream> #include <algorithm> using namespace std; const int MAX_N = 100000; int t, n, cnm[MAX_N + 1], lncm, lastn, w, poc, kon; char c, lc; bool pn, on; bool cmp(int &fi, int&se) { if (fi <= se)return false; return true; } int main() { ios_base::sync_with_stdio(0); cin >> t; for (; t >= 1; t--) { cin >> n >> c; if (1 == n) { if ('0' == c) { cout << "1\n"; continue; } cout << "0\n"; continue; } lncm = 0; lastn = 0; if ('0' == c) { pn = true; lastn++; } if ('1' == c) { pn = false; } for (int i = 1; i < n - 1; i++) { lc = c; cin >> c; if ('1' == c) { if ('1' == lc)continue; cnm[lncm] = lastn; lncm++; lastn = 0; continue; } lastn++; } lc = c; cin >> c; if ('1' == c) { on = false; if ('0' == lc) { cnm[lncm] = lastn; lncm++; lastn = 0; } } else { on = true; cnm[lncm] = lastn + 1; lncm++; } if (1 == lncm && (true == on || true == pn)) { cout << n-cnm[0]<<"\n"; continue; } poc = 0; kon = lncm-1; if (true == pn) { cnm[0] *= 2; poc++; } if (true == on) { cnm[lncm - 1] *= 2; kon--; } for (int i = poc; i <= kon; i++) { cnm[lncm] = cnm[i]; lncm++; } sort(cnm, cnm + lncm, cmp); w = 0; for (int i = 0; i < lncm; i++) { if (2 * i >= cnm[i])break; w += cnm[i]; w -= 2 * i; } w += w % 2; w /= 2; cout << n-w<<"\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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | #include <iostream> #include <algorithm> using namespace std; const int MAX_N = 100000; int t, n, cnm[MAX_N + 1], lncm, lastn, w, poc, kon; char c, lc; bool pn, on; bool cmp(int &fi, int&se) { if (fi <= se)return false; return true; } int main() { ios_base::sync_with_stdio(0); cin >> t; for (; t >= 1; t--) { cin >> n >> c; if (1 == n) { if ('0' == c) { cout << "1\n"; continue; } cout << "0\n"; continue; } lncm = 0; lastn = 0; if ('0' == c) { pn = true; lastn++; } if ('1' == c) { pn = false; } for (int i = 1; i < n - 1; i++) { lc = c; cin >> c; if ('1' == c) { if ('1' == lc)continue; cnm[lncm] = lastn; lncm++; lastn = 0; continue; } lastn++; } lc = c; cin >> c; if ('1' == c) { on = false; if ('0' == lc) { cnm[lncm] = lastn; lncm++; lastn = 0; } } else { on = true; cnm[lncm] = lastn + 1; lncm++; } if (1 == lncm && (true == on || true == pn)) { cout << n-cnm[0]<<"\n"; continue; } poc = 0; kon = lncm-1; if (true == pn) { cnm[0] *= 2; poc++; } if (true == on) { cnm[lncm - 1] *= 2; kon--; } for (int i = poc; i <= kon; i++) { cnm[lncm] = cnm[i]; lncm++; } sort(cnm, cnm + lncm, cmp); w = 0; for (int i = 0; i < lncm; i++) { if (2 * i >= cnm[i])break; w += cnm[i]; w -= 2 * i; } w += w % 2; w /= 2; cout << n-w<<"\n"; } } |