#include <bits/stdc++.h> using namespace std; template <typename T> std::ostream & operator << (std::ostream & os, const std::vector<T> & vec) { for(auto elem : vec) os<<elem<< " "; return os; } void solve() { int n; cin >> n; vector<int> b; b.push_back(0); // indeksujemy od 1. int j=0; char prev = '-'; string s; cin >> s; priority_queue<int> extreme; int first_one = s.find_first_of('1'); if (first_one == string::npos) { cout << 0 << endl; return; } else if (first_one > 0) extreme.push(first_one); int last_one = s.find_last_of('1'); if (last_one < s.length() - 1) extreme.push(s.length() - 1 - last_one); for (int i=first_one; i<last_one; ++i) { if (s[i] == '0') { if (prev == '1') { b.push_back(0); ++j; } b[j]++; } prev = s[i]; } // cout << "wejsciowy: " << b << endl; sort (b.begin(), b.end(), greater<int>()); // na koncu strażnik: 0. j = 0; int t = 0; int saved = 0; while (true) { if (not extreme.empty() and extreme.top() - t > max(0, (b[j] - 2*t) / 2)) { saved += extreme.top() - t; extreme.pop(); ++t; } else if (b[j] - 2*t > 0) { saved += (b[j] - 2*t) > 1 ? b[j] - 2*t - 1 : 1; j += 1; t += 2; } else break; } cout << n - saved << endl; } int main() { int t; cin >> t; for (int i=0; i<t; ++i) solve(); }
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 | #include <bits/stdc++.h> using namespace std; template <typename T> std::ostream & operator << (std::ostream & os, const std::vector<T> & vec) { for(auto elem : vec) os<<elem<< " "; return os; } void solve() { int n; cin >> n; vector<int> b; b.push_back(0); // indeksujemy od 1. int j=0; char prev = '-'; string s; cin >> s; priority_queue<int> extreme; int first_one = s.find_first_of('1'); if (first_one == string::npos) { cout << 0 << endl; return; } else if (first_one > 0) extreme.push(first_one); int last_one = s.find_last_of('1'); if (last_one < s.length() - 1) extreme.push(s.length() - 1 - last_one); for (int i=first_one; i<last_one; ++i) { if (s[i] == '0') { if (prev == '1') { b.push_back(0); ++j; } b[j]++; } prev = s[i]; } // cout << "wejsciowy: " << b << endl; sort (b.begin(), b.end(), greater<int>()); // na koncu strażnik: 0. j = 0; int t = 0; int saved = 0; while (true) { if (not extreme.empty() and extreme.top() - t > max(0, (b[j] - 2*t) / 2)) { saved += extreme.top() - t; extreme.pop(); ++t; } else if (b[j] - 2*t > 0) { saved += (b[j] - 2*t) > 1 ? b[j] - 2*t - 1 : 1; j += 1; t += 2; } else break; } cout << n - saved << endl; } int main() { int t; cin >> t; for (int i=0; i<t; ++i) solve(); } |