题目的数据规模明显需要nlogn的算法,直接暴力n^2肯定会超时。
思路:首先定义一个数组sum保存到第i个结点时有多少个1.
然后遍历,从第i个结点开始能得到的最大长度,它等于1的个数加上可以改变成1的0的个数。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int a[1000001], sum[1000001];
int main( )
{
int n, k;
scanf("%d %d", &n, &k);
for (int i = 1; i <= n; i ++)
scanf("%d", &a[i]), sum[i] = sum[i - 1] + a[i];
int ans = 0,t1,t2;
for(int i=1;i<=n;i++){
int l=i,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(mid-i+1<=k+sum[mid]-sum[i-1])
l=mid+1;
else
r=mid-1;
}
int pos=r;
if(pos-i+1>ans){
ans=pos-i+1;
t1=i;
t2=pos;
}
}
printf("%d\n", ans);
for (int i = t1; i <= t2; i ++) a[i] = 1;
for (int i = 1; i <= n; i ++)
printf("%d ", a[i]);
printf("\n");
return 0;
}