#include <algorithm>
#include <functional>
#include <iostream>
#include <utility>
#include <vector>
int main(void) {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int T;
std::cin >> T;
for (int t = 0; t < T; t++) {
int n;
std::cin >> n;
std::string s;
std::cin >> s;
std::vector<int> groups[2];
for (int i = 0; i < n; i++) {
if (s[i] == '0') {
int start = i;
int end = start;
for (i = start + 1; i < n && s[i] == '0'; i++) {
end = i;
}
int borders = ((start > 0 && s[start-1] == '1') ? 1 : 0) + ((end + 1 < n && s[end+1] == '1') ? 1 : 0);
if (borders != 0) {
groups[borders-1].push_back(end - start + 1);
}
}
}
if (groups[0].size() + groups[1].size() == 0) {
std::cout << 0 << std::endl;
continue;
}
std::sort(groups[0].begin(), groups[0].end(), std::greater<int>());
std::sort(groups[1].begin(), groups[1].end(), std::greater<int>());
int i = 0, j = 0, turns = 0, score = 0, gain0, gain1;
do {
gain0 = i < groups[0].size() ? groups[0][i] : 0;
gain1 = j < groups[1].size() ? groups[1][j] - 1 : 0;
gain0 -= turns;
gain1 -= turns * 2;
gain0 = std::max(0, gain0);
gain1 = std::max(0, gain1);
if (gain1 >= gain0) {
score += gain1;
j++;
turns += 2;
} else {
score += gain0;
i++;
turns++;
}
//std::cerr << score << ' ' << turns << ' ';
} while (gain0 > 0 || gain1 > 0);
std::cout << (n - score) << std::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 | #include <algorithm> #include <functional> #include <iostream> #include <utility> #include <vector> int main(void) { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int T; std::cin >> T; for (int t = 0; t < T; t++) { int n; std::cin >> n; std::string s; std::cin >> s; std::vector<int> groups[2]; for (int i = 0; i < n; i++) { if (s[i] == '0') { int start = i; int end = start; for (i = start + 1; i < n && s[i] == '0'; i++) { end = i; } int borders = ((start > 0 && s[start-1] == '1') ? 1 : 0) + ((end + 1 < n && s[end+1] == '1') ? 1 : 0); if (borders != 0) { groups[borders-1].push_back(end - start + 1); } } } if (groups[0].size() + groups[1].size() == 0) { std::cout << 0 << std::endl; continue; } std::sort(groups[0].begin(), groups[0].end(), std::greater<int>()); std::sort(groups[1].begin(), groups[1].end(), std::greater<int>()); int i = 0, j = 0, turns = 0, score = 0, gain0, gain1; do { gain0 = i < groups[0].size() ? groups[0][i] : 0; gain1 = j < groups[1].size() ? groups[1][j] - 1 : 0; gain0 -= turns; gain1 -= turns * 2; gain0 = std::max(0, gain0); gain1 = std::max(0, gain1); if (gain1 >= gain0) { score += gain1; j++; turns += 2; } else { score += gain0; i++; turns++; } //std::cerr << score << ' ' << turns << ' '; } while (gain0 > 0 || gain1 > 0); std::cout << (n - score) << std::endl; } return 0; } |
English