#include <bits/stdc++.h>
using namespace std;
vector<int> lens;
vector<pair<int, int>> segments;
bool custom_cmp(pair<int, int> x, pair<int, int> y) {
int a = x.first/x.second*x.second;
int b = y.first/y.second*y.second;
if(a*y.second == b*x.second) {
return x.first > y.first;
}
return a*y.second < b*x.second;
}
int main() {
// cout << custom_cmp({5, -2}, {3, -1}) << endl;
// return 0;
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while(t--) {
lens.clear();
segments.clear();
int n;
cin >> n;
string s;
cin >> s;
// cout << s << endl;
int i = 0;
int infected = 0;
while(i < n) {
int len = 0;
while(i < n && s[i] == '0') {
len++;
i++;
}
while(i < n && s[i] == '1') {
infected++;
i++;
}
if(len) {
lens.push_back(len);
}
}
if(lens.size() == 0) {
cout << infected << "\n";
continue;
}
// for(auto x: lens) {
// cout << x << " ";
// }
// cout << endl;
for(auto x: lens) {
segments.push_back({x, -2});
}
if(s[0] == '0') {
segments[0].second++;
}
if(s.back() == '0') {
segments.back().second++;
}
// cout << segments.size() << endl;
sort(segments.begin(), segments.end(), custom_cmp);
// reverse(segments.begin(), segments.end());
// for(auto x: segments) {
// cout << x.first << " " << x.second << endl;
// }
// cout << endl;
// for(auto x: segments) {
// cout << x.first << " " << x.second << endl;
// }
// int days = 0;
// for(auto seg: segments) {
// cout << "d: " << days << endl;
// int last_days = 0;
// while(seg.second && seg.first) {
// int m = min(seg.first, -(days - last_days)*seg.second);
// infected += m;
// cout << m << endl;
// seg.first -= m;
// if(seg.first) {
// seg.first--;
// }
// seg.second++;
// last_days = days;
// days++;
// }
// }
int days = 0;
for(auto seg: segments) {
// cout << "days: " << days << endl;
int m = min(seg.first, -days*seg.second);
// cout << "m: " << m << endl;
infected += m;
seg.first -= m;
while(seg.first && seg.second) {
// cout << seg.first << " " << seg.second << endl;
if(seg.first) {
seg.first--;
seg.second++;
}
// cout << seg.first << " " << seg.second << endl;
if(seg.first) {
seg.first += seg.second;
infected -= seg.second;
}
days++;
}
}
// return 0;
cout << infected << "\n";
// cout << 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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #include <bits/stdc++.h> using namespace std; vector<int> lens; vector<pair<int, int>> segments; bool custom_cmp(pair<int, int> x, pair<int, int> y) { int a = x.first/x.second*x.second; int b = y.first/y.second*y.second; if(a*y.second == b*x.second) { return x.first > y.first; } return a*y.second < b*x.second; } int main() { // cout << custom_cmp({5, -2}, {3, -1}) << endl; // return 0; ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--) { lens.clear(); segments.clear(); int n; cin >> n; string s; cin >> s; // cout << s << endl; int i = 0; int infected = 0; while(i < n) { int len = 0; while(i < n && s[i] == '0') { len++; i++; } while(i < n && s[i] == '1') { infected++; i++; } if(len) { lens.push_back(len); } } if(lens.size() == 0) { cout << infected << "\n"; continue; } // for(auto x: lens) { // cout << x << " "; // } // cout << endl; for(auto x: lens) { segments.push_back({x, -2}); } if(s[0] == '0') { segments[0].second++; } if(s.back() == '0') { segments.back().second++; } // cout << segments.size() << endl; sort(segments.begin(), segments.end(), custom_cmp); // reverse(segments.begin(), segments.end()); // for(auto x: segments) { // cout << x.first << " " << x.second << endl; // } // cout << endl; // for(auto x: segments) { // cout << x.first << " " << x.second << endl; // } // int days = 0; // for(auto seg: segments) { // cout << "d: " << days << endl; // int last_days = 0; // while(seg.second && seg.first) { // int m = min(seg.first, -(days - last_days)*seg.second); // infected += m; // cout << m << endl; // seg.first -= m; // if(seg.first) { // seg.first--; // } // seg.second++; // last_days = days; // days++; // } // } int days = 0; for(auto seg: segments) { // cout << "days: " << days << endl; int m = min(seg.first, -days*seg.second); // cout << "m: " << m << endl; infected += m; seg.first -= m; while(seg.first && seg.second) { // cout << seg.first << " " << seg.second << endl; if(seg.first) { seg.first--; seg.second++; } // cout << seg.first << " " << seg.second << endl; if(seg.first) { seg.first += seg.second; infected -= seg.second; } days++; } } // return 0; cout << infected << "\n"; // cout << endl; } return 0; } |
English