#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; } |
English