#include <bits/stdc++.h>
using namespace std;
int t;
long long n;
string s;
long long i, ile, l, r;
priority_queue<long long> pq;
long long czas, cur, res;
void solve()
{
cin >> n;
cin >> s;
ile = 0, l = 0, r = 0;
pq = priority_queue<long long>();
czas = 0, cur = 0, res = 0;
for (i = 0; i < n; ++i)
if (s[i] == '0')
ile++;
else
break;
if (ile == n)
{
cout << "0\n";
return;
}
l = ile;
ile = 0;
for (i; i < n; ++i)
{
if (s[i] == '0')
ile++;
else
{
if (ile > 0)
pq.push(ile);
ile = 0;
}
}
r = ile;
while (!pq.empty() || l > czas || r > czas) // brak środkowych i skrajnych
{
cur = 0;
if (!pq.empty()) // dalej trzeba rozpatrzyć skrajne
cur = pq.top();
if (cur <= 2 * czas && l <= czas && r <= czas) // wszystkie już chore
break;
if (cur - 2 * czas <= l - czas + 2 && l > czas && l >= r) // lepiej skrajne niż środkowe (lewy jest lepszy niż prawy)
{
res += l - czas;
l = 0;
czas += 1;
}
else if (cur - 2 * czas <= r - czas + 2 && r > czas) // lepiej skrajne niż środkowe (prawy jest gorszy niż lewy)
{
res += r - czas;
r = 0;
czas += 1;
}
else if (cur - 2 * czas == 1) // zaszczepimy tylko 1 miasto ze środkowego
{
res++;
czas++;
pq.pop();
}
else // oddzielimy przedział miast dłuższy od 1
{
res += cur - 2 * czas - 1;
czas += 2;
pq.pop();
}
}
cout << n - res << '\n';
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--)
solve();
}
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 | #include <bits/stdc++.h> using namespace std; int t; long long n; string s; long long i, ile, l, r; priority_queue<long long> pq; long long czas, cur, res; void solve() { cin >> n; cin >> s; ile = 0, l = 0, r = 0; pq = priority_queue<long long>(); czas = 0, cur = 0, res = 0; for (i = 0; i < n; ++i) if (s[i] == '0') ile++; else break; if (ile == n) { cout << "0\n"; return; } l = ile; ile = 0; for (i; i < n; ++i) { if (s[i] == '0') ile++; else { if (ile > 0) pq.push(ile); ile = 0; } } r = ile; while (!pq.empty() || l > czas || r > czas) // brak środkowych i skrajnych { cur = 0; if (!pq.empty()) // dalej trzeba rozpatrzyć skrajne cur = pq.top(); if (cur <= 2 * czas && l <= czas && r <= czas) // wszystkie już chore break; if (cur - 2 * czas <= l - czas + 2 && l > czas && l >= r) // lepiej skrajne niż środkowe (lewy jest lepszy niż prawy) { res += l - czas; l = 0; czas += 1; } else if (cur - 2 * czas <= r - czas + 2 && r > czas) // lepiej skrajne niż środkowe (prawy jest gorszy niż lewy) { res += r - czas; r = 0; czas += 1; } else if (cur - 2 * czas == 1) // zaszczepimy tylko 1 miasto ze środkowego { res++; czas++; pq.pop(); } else // oddzielimy przedział miast dłuższy od 1 { res += cur - 2 * czas - 1; czas += 2; pq.pop(); } } cout << n - res << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> t; while (t--) solve(); } |
English