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