题目链接:
http://codeforces.com/contest/660/problem/C
题意:
将最多k个0变成1,使得连续的1的个数最大
题解:
二分连续的1的个数x。用前缀和判断区间[i,i+x-1]里面0的个数是否小于等于k。
代码:
#include<iostream> #include<cstdio> #include<vector> #include<cstring> using namespace std; const int maxn=3e5+10; int n,k; int sum[maxn],arr[maxn]; bool ok(int x,int &pos){ for(int i=0;i+x<=n;i++){ if(x-(sum[i+x]-sum[i])<=k){ pos=i+1; return true; } } return false; } int main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ scanf("%d",arr+i); } sum[0]=0; for(int i=1;i<=n;i++){ sum[i]=sum[i-1]+arr[i]; } int l=k,r=n+1,pos; while(l+1<r){ int mid=l+(r-l)/2; if(ok(mid,pos)) l=mid; else r=mid; } ok(l,pos); for(int i=pos;i<pos+l;i++){ arr[i]=1; } printf("%d ",l); for(int i=1;i<n;i++) printf("%d ",arr[i]); printf("%d ",arr[n]); return 0; }