#include <bits/stdc++.h>
using namespace std;
struct xdd {
int k;
int te;
int td;
};
struct wieksze {
bool operator()(const struct xdd &a, const struct xdd &b) const {
return a.te != b.te ? a.te>b.te : a.td>b.td;
}
};
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int tt;
cin >> tt;
int n, k, t, suma;
string s;
bool first;
vector<struct xdd> xd;
s.reserve(100'005);
while(tt--) {
cin >> n;
cin >> s;
xd.clear();
first = true, k = 0;
for(auto &&e : s) {
if(e == '0'){
++k;
} else { // '1'
if(k>0)
xd.push_back({k, k*(first?2:1), first?1:2});
first = false, k = 0;
}
}
if(k>0) xd.push_back({k, k*2, 1});
sort(xd.begin(), xd.end(), wieksze());
t = 0, suma = 0;
for(auto &&e : xd) {
//cerr << t << ' ' << suma << ' ' << e.k << ' ' << e.td << endl;
if(e.k-e.td*t>0) { // 5 i t=2
++suma, ++t; // potencjalne jeszcze 4 i t=3
if(e.td==1) {
suma += e.k-t; // -1 zaszczepiony dodany do t
continue;
}
if(e.k-2*t>0) { // jednego zjadło, a drugiego zaszczepiliśmy
suma += e.k-2*t; ++t; // szczepimy dopełniając przedział
}
}
}
cout << n-suma << '\n';
}
}
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 | #include <bits/stdc++.h> using namespace std; struct xdd { int k; int te; int td; }; struct wieksze { bool operator()(const struct xdd &a, const struct xdd &b) const { return a.te != b.te ? a.te>b.te : a.td>b.td; } }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int tt; cin >> tt; int n, k, t, suma; string s; bool first; vector<struct xdd> xd; s.reserve(100'005); while(tt--) { cin >> n; cin >> s; xd.clear(); first = true, k = 0; for(auto &&e : s) { if(e == '0'){ ++k; } else { // '1' if(k>0) xd.push_back({k, k*(first?2:1), first?1:2}); first = false, k = 0; } } if(k>0) xd.push_back({k, k*2, 1}); sort(xd.begin(), xd.end(), wieksze()); t = 0, suma = 0; for(auto &&e : xd) { //cerr << t << ' ' << suma << ' ' << e.k << ' ' << e.td << endl; if(e.k-e.td*t>0) { // 5 i t=2 ++suma, ++t; // potencjalne jeszcze 4 i t=3 if(e.td==1) { suma += e.k-t; // -1 zaszczepiony dodany do t continue; } if(e.k-2*t>0) { // jednego zjadło, a drugiego zaszczepiliśmy suma += e.k-2*t; ++t; // szczepimy dopełniając przedział } } } cout << n-suma << '\n'; } } |
English