#include <stdio.h> #include <vector> #include <map> #include <unordered_set> #include <queue> #include <set> #include <unordered_map> #include <math.h> #include <limits.h> #include <algorithm> #include <functional> #include <iterator> #include <algorithm> #include <string> #include <iostream> using namespace std; #define pb push_back #define mp make_pair typedef long long ll; typedef unsigned long long ull; using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); int t, n; char ci; cin >> t; while (t --> 0) { vector<bool> cities; vector<int> strikes; int toxic = 0; cin >> n; int no_toxic_strike = 0; int left = -1; for (int i=0; i<n; ++i) { cin >> ci; bool is_toxic = ci == '1'; cities.pb(is_toxic); if (is_toxic) { toxic++; if (left == -1) { left = no_toxic_strike; } else { if (no_toxic_strike > 0) strikes.pb(no_toxic_strike); } no_toxic_strike = 0; } else { no_toxic_strike++; } } int right = no_toxic_strike; vector<int> singles; singles.pb(left); singles.pb(right); sort(strikes.begin(), strikes.end()); sort(singles.begin(), singles.end()); int saved = 0; int ticks = 0; int old_ticks = -1; while (old_ticks != ticks) { old_ticks = ticks; int mcurrent = -1; if (strikes.size() > 0) mcurrent = strikes.back() - ticks * 2; int scurrent = -1; if (singles.size() > 0) scurrent = singles.back() - ticks; if (scurrent < 1 && mcurrent < 1) break; if (scurrent > 0 && (scurrent >= mcurrent - 1 || mcurrent == 3 || (mcurrent == 5 && scurrent == 3))) { saved += scurrent; ticks++; singles.pop_back(); } else if (mcurrent > 0) { if (mcurrent > 2) { ticks += 2; saved += mcurrent-1; strikes.pop_back(); } else if (mcurrent == 2 || mcurrent == 1) { ticks++; saved += 1; strikes.pop_back(); } } else if (scurrent > 0) { saved += scurrent; ticks++; singles.pop_back(); } } cout << (n - saved) << 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 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 | #include <stdio.h> #include <vector> #include <map> #include <unordered_set> #include <queue> #include <set> #include <unordered_map> #include <math.h> #include <limits.h> #include <algorithm> #include <functional> #include <iterator> #include <algorithm> #include <string> #include <iostream> using namespace std; #define pb push_back #define mp make_pair typedef long long ll; typedef unsigned long long ull; using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); int t, n; char ci; cin >> t; while (t --> 0) { vector<bool> cities; vector<int> strikes; int toxic = 0; cin >> n; int no_toxic_strike = 0; int left = -1; for (int i=0; i<n; ++i) { cin >> ci; bool is_toxic = ci == '1'; cities.pb(is_toxic); if (is_toxic) { toxic++; if (left == -1) { left = no_toxic_strike; } else { if (no_toxic_strike > 0) strikes.pb(no_toxic_strike); } no_toxic_strike = 0; } else { no_toxic_strike++; } } int right = no_toxic_strike; vector<int> singles; singles.pb(left); singles.pb(right); sort(strikes.begin(), strikes.end()); sort(singles.begin(), singles.end()); int saved = 0; int ticks = 0; int old_ticks = -1; while (old_ticks != ticks) { old_ticks = ticks; int mcurrent = -1; if (strikes.size() > 0) mcurrent = strikes.back() - ticks * 2; int scurrent = -1; if (singles.size() > 0) scurrent = singles.back() - ticks; if (scurrent < 1 && mcurrent < 1) break; if (scurrent > 0 && (scurrent >= mcurrent - 1 || mcurrent == 3 || (mcurrent == 5 && scurrent == 3))) { saved += scurrent; ticks++; singles.pop_back(); } else if (mcurrent > 0) { if (mcurrent > 2) { ticks += 2; saved += mcurrent-1; strikes.pop_back(); } else if (mcurrent == 2 || mcurrent == 1) { ticks++; saved += 1; strikes.pop_back(); } } else if (scurrent > 0) { saved += scurrent; ticks++; singles.pop_back(); } } cout << (n - saved) << endl; } return 0; } |