题目链接:https://vjudge.net/contest/209688#problem/B
题意描述:给程度为n的01字符串,最多蒋k个0改为1,问最长的1串是多长并输出改后字符串。
数据范围: (1 ≤ n ≤ 3·105, 0 ≤ k ≤ n)
解题思路:简单的二分
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int sum[300005], a[300005];
int m, n, k;
bool judge(int o) {
int y;
for(int i=1;i<=n;i++)
{
y=i+o-1;
if(y>n) break;
if(sum[y]-sum[i-1]<=k)
{
m=i;
return 1;
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
sum[0]=0;
for(int i=1; i<=n;i++)
{
scanf("%d", &a[i]);
if(a[i]==0)
sum[i]=sum[i-1]+1;
else sum[i]=sum[i-1];
}
int l=1, r=n,ans=0;
while(l<=r)
{
int mid=(l + r)/2;
if(judge(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n", ans);
for(int i=m; i<=m+ans-1;i++)
{
a[i]=1;
}
for(int i=1;i<=n;i++) {
if(i>1) printf(" ");
printf("%d", a[i]);
}
printf("\n");
}
return 0;
}