#include <iostream> #include <vector> #include <algorithm> #define lli long long int using namespace std; int a, b, c, d, e, l, k, p, w, n, m, q, pop; vector <int> wiel; vector <int> skraj, wej; char z; int main() { scanf("%d", &q); for (int S = 0; S != q; ++S) { scanf("%d\n", &n); wej.clear(); for (a = 0; a != n; ++a) { scanf("%c", &z); if (z == '1') { wej.push_back(a); } } if (wej.empty()) { printf("0\n"); continue; } skraj.clear(); if (wej.front()) { skraj.push_back(wej.front()); } if (wej.back() < n - 1) { skraj.push_back(n - wej.back() - 1); if (skraj.front() > skraj.back()) { swap(skraj.front(), skraj.back()); } } wiel.clear(); // a-poczatek przedzialu for (a = 1; a < wej.size() - 1; ++a) { if (wej[a] + 1 != wej[a + 1]) { wiel.push_back(wej[a + 1] - wej[a] - 1); } } if (!wiel.empty()) { sort(wiel.begin(), wiel.end()); } l = 0; w = 0; while (1) { while (!wiel.empty() && wiel.back() - l * 2 <= 0) { wiel.pop_back(); } while (!skraj.empty() && skraj.back() <= l) { skraj.pop_back(); } if (wiel.empty() && skraj.empty()) { break; } if (wiel.empty()) { w += skraj.back() - l; skraj.pop_back(); ++l; continue; } p = max(1, wiel.back() - l * 2 - 1); if (skraj.empty()) { w += p; l += 2; wiel.pop_back(); continue; } if (p > skraj.back() - l) // *.* == *..* *...* !=*..* -> -- - { w += p; l += 2; wiel.pop_back(); continue; } w += skraj.back() - l; ++l; skraj.pop_back(); } printf("%d\n", n-w); } }
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 | #include <iostream> #include <vector> #include <algorithm> #define lli long long int using namespace std; int a, b, c, d, e, l, k, p, w, n, m, q, pop; vector <int> wiel; vector <int> skraj, wej; char z; int main() { scanf("%d", &q); for (int S = 0; S != q; ++S) { scanf("%d\n", &n); wej.clear(); for (a = 0; a != n; ++a) { scanf("%c", &z); if (z == '1') { wej.push_back(a); } } if (wej.empty()) { printf("0\n"); continue; } skraj.clear(); if (wej.front()) { skraj.push_back(wej.front()); } if (wej.back() < n - 1) { skraj.push_back(n - wej.back() - 1); if (skraj.front() > skraj.back()) { swap(skraj.front(), skraj.back()); } } wiel.clear(); // a-poczatek przedzialu for (a = 1; a < wej.size() - 1; ++a) { if (wej[a] + 1 != wej[a + 1]) { wiel.push_back(wej[a + 1] - wej[a] - 1); } } if (!wiel.empty()) { sort(wiel.begin(), wiel.end()); } l = 0; w = 0; while (1) { while (!wiel.empty() && wiel.back() - l * 2 <= 0) { wiel.pop_back(); } while (!skraj.empty() && skraj.back() <= l) { skraj.pop_back(); } if (wiel.empty() && skraj.empty()) { break; } if (wiel.empty()) { w += skraj.back() - l; skraj.pop_back(); ++l; continue; } p = max(1, wiel.back() - l * 2 - 1); if (skraj.empty()) { w += p; l += 2; wiel.pop_back(); continue; } if (p > skraj.back() - l) // *.* == *..* *...* !=*..* -> -- - { w += p; l += 2; wiel.pop_back(); continue; } w += skraj.back() - l; ++l; skraj.pop_back(); } printf("%d\n", n-w); } } |