#include<bits/stdc++.h>
using namespace std;
int z,n,dp[100005];
string s;
priority_queue < pair<int,int> > Q;
stack < pair< pair<int,int> ,int> > S;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>z;
while(z)
{
z--;
cin>>n>>s;
int dl = 0;
for(int i = n - 1;i >= 0; i--)
if(s[i] == '0')
dl++;
else
break;
if(dl == n)
{
cout<<"0\n";
continue;
}
if(dl > 0)
Q.push({dl + 100000,1});
dl = 0;
for(int i = 0;i < n; i++)
if(s[i] == '0')
dl++;
else
break;
if(dl > 0)
Q.push({dl + 100000,1});
int dl2 = 0;
for(int i = dl;i < n; i++)
if(s[i] == '0')
dl2++;
else if(dl2 > 0)
{
Q.push({dl2,min(dl2,2)});
dl2 = 0;
}
int maxDzien = 0,dzien;
while(!Q.empty())
{
dzien = 0;
int x = Q.top().first,dx = Q.top().second;
if(x > 100000)
x -= 100000;
Q.pop();
maxDzien = max(maxDzien,x / dx + x % dx);
for(int i = 1;i <= maxDzien; i++)
dp[i] = max(dp[i],dp[i - 1]);
while(x > 0)
{
dx = min(dx,x);
S.push({{x - (dx - 1),dzien},dx});
dzien++;
x -= dx;
}
while(!S.empty())
{
int a = S.top().first.first;
int b = S.top().first.second;
int c = S.top().second;
S.pop();
dp[b + c] = max(dp[b + c],dp[b] + a);
}
}
int wyn = 0;
for(int i = 0;i <= maxDzien + 2; i++)
{
wyn = max(wyn,dp[i]);
dp[i] = 0;
}
cout<<n - wyn<<'\n';
}
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 | #include<bits/stdc++.h> using namespace std; int z,n,dp[100005]; string s; priority_queue < pair<int,int> > Q; stack < pair< pair<int,int> ,int> > S; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>z; while(z) { z--; cin>>n>>s; int dl = 0; for(int i = n - 1;i >= 0; i--) if(s[i] == '0') dl++; else break; if(dl == n) { cout<<"0\n"; continue; } if(dl > 0) Q.push({dl + 100000,1}); dl = 0; for(int i = 0;i < n; i++) if(s[i] == '0') dl++; else break; if(dl > 0) Q.push({dl + 100000,1}); int dl2 = 0; for(int i = dl;i < n; i++) if(s[i] == '0') dl2++; else if(dl2 > 0) { Q.push({dl2,min(dl2,2)}); dl2 = 0; } int maxDzien = 0,dzien; while(!Q.empty()) { dzien = 0; int x = Q.top().first,dx = Q.top().second; if(x > 100000) x -= 100000; Q.pop(); maxDzien = max(maxDzien,x / dx + x % dx); for(int i = 1;i <= maxDzien; i++) dp[i] = max(dp[i],dp[i - 1]); while(x > 0) { dx = min(dx,x); S.push({{x - (dx - 1),dzien},dx}); dzien++; x -= dx; } while(!S.empty()) { int a = S.top().first.first; int b = S.top().first.second; int c = S.top().second; S.pop(); dp[b + c] = max(dp[b + c],dp[b] + a); } } int wyn = 0; for(int i = 0;i <= maxDzien + 2; i++) { wyn = max(wyn,dp[i]); dp[i] = 0; } cout<<n - wyn<<'\n'; } return 0; } |
English