Educational Codeforces Round 11 C. Hard Process 前缀和+二分
题目链接:
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\n",l); for(int i=1;i<n;i++) printf("%d ",arr[i]); printf("%d\n",arr[n]); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步