#include<cstdio> #include<iostream> #include<algorithm> #include<string> #include<vector> using namespace std; typedef vector<int> VI; typedef long long LL; #define FOR(x, b, e) for(int x=b; x<=(e); ++x) #define FORD(x, b, e) for(int x=b; x>=(e); --x) #define REP(x, n) for(int x=0; x<(n); ++x) #define VAR(v, n) __typeof(n) v = (n) #define ALL(c) (c).begin(), (c).end() #define SIZE(x) ((int)(x).size()) #define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) #define PB push_back #define ST first #define ND second int main() { ios_base::sync_with_stdio(0); int t; cin >> t; while(t--) { int n; string cities; cin >> n >> cities; int i = 0; while(i < n && cities[i] == '0') i++; if(i == n) { cout << "0\n"; } else { int j = n - 1; while(cities[j] == '0') j--; VI lengths; int k = i + 1; while(k < j) { while(cities[k] == '1' && k < j) k++; int l = k + 1; while(cities[l] == '0' && l < j) l++; if(cities[k] == '0') lengths.PB(l - k); k = l + 1; } sort(lengths.rbegin(), lengths.rend()); int first = 0, second = 0, third = 0; int days = 0, days2 = 0; REP(x, lengths.size()) { int tmp = lengths[x] - 4 * x - 1; if(tmp < 0) break; if(tmp == 0) { tmp = 1; days++; } else days += 2; first += tmp; if(tmp - 2 == 0) days2++; else if(tmp - 2 > 0) days2 += 2; second += max(0, tmp - 2 == 0 ? 1 : tmp - 2); third += max(0, tmp - 4 == 0 ? 1 : tmp - 4); } int prefix = i - days; int case1 = prefix > 0 ? first + prefix + max(0, n - j - days - 2) : first + max(0, n - j - 1 - days); int case2 = i > 0 ? i + second + max(0, n - j - 2 - days2) : 0; int case3 = n != j ? n - j - 1 + second + max(0, i - days2 - 1) : 0; int case4 = i > 0 && n != j ? i + n - j - 2 + third : 0; cout << n - max(max(case1, case2), max(case3, case4)) << '\n'; } } 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 | #include<cstdio> #include<iostream> #include<algorithm> #include<string> #include<vector> using namespace std; typedef vector<int> VI; typedef long long LL; #define FOR(x, b, e) for(int x=b; x<=(e); ++x) #define FORD(x, b, e) for(int x=b; x>=(e); --x) #define REP(x, n) for(int x=0; x<(n); ++x) #define VAR(v, n) __typeof(n) v = (n) #define ALL(c) (c).begin(), (c).end() #define SIZE(x) ((int)(x).size()) #define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) #define PB push_back #define ST first #define ND second int main() { ios_base::sync_with_stdio(0); int t; cin >> t; while(t--) { int n; string cities; cin >> n >> cities; int i = 0; while(i < n && cities[i] == '0') i++; if(i == n) { cout << "0\n"; } else { int j = n - 1; while(cities[j] == '0') j--; VI lengths; int k = i + 1; while(k < j) { while(cities[k] == '1' && k < j) k++; int l = k + 1; while(cities[l] == '0' && l < j) l++; if(cities[k] == '0') lengths.PB(l - k); k = l + 1; } sort(lengths.rbegin(), lengths.rend()); int first = 0, second = 0, third = 0; int days = 0, days2 = 0; REP(x, lengths.size()) { int tmp = lengths[x] - 4 * x - 1; if(tmp < 0) break; if(tmp == 0) { tmp = 1; days++; } else days += 2; first += tmp; if(tmp - 2 == 0) days2++; else if(tmp - 2 > 0) days2 += 2; second += max(0, tmp - 2 == 0 ? 1 : tmp - 2); third += max(0, tmp - 4 == 0 ? 1 : tmp - 4); } int prefix = i - days; int case1 = prefix > 0 ? first + prefix + max(0, n - j - days - 2) : first + max(0, n - j - 1 - days); int case2 = i > 0 ? i + second + max(0, n - j - 2 - days2) : 0; int case3 = n != j ? n - j - 1 + second + max(0, i - days2 - 1) : 0; int case4 = i > 0 && n != j ? i + n - j - 2 + third : 0; cout << n - max(max(case1, case2), max(case3, case4)) << '\n'; } } return 0; } |