另外,如果l > r 了,就使得r = l,然后继续使我们的“尺”往后移。直到跑到最后一个元素为止。
#include<iostream>#include<cstdio>#include<cmath>#include<string>#include<cstring>#include<algorithm>#include<limits>#include<vector>#include<stack>#include<queue>#include<set>#include<map>#define INF 0x3f3f3f3f#define MID l + r >> 1#define lsn rt << 1#define rsn rt << 1 | 1#define Lson lsn, l, mid#define Rson rsn, mid+1, r#define QL Lson, ql, qr#define QR Rson, ql, qrusingnamespace std;typedeflonglong ll;constint maxN =3e5+7;constint maxM =1e7;int n, k, a[maxN]={0};intmain(){while(~scanf("%d%d",&n,&k)){for(int i =1; i <= n; i ++)scanf("%d",&a[i]);int l =1, r =1, zero =0;int ans =0, ansL =0, ansR =0;while(l <= n && r <= n){if(r < l)
r = l;if(a[r]==1){if(ans < r - l +1){
ans = r - l +1;
ansL = l; ansR = r;}
r ++;}elseif(zero < k){if(ans < r - l +1){
ans = r - l +1;
ansL = l; ansR = r;}
zero ++;
r ++;}else{if(a[l]==0&& k)
zero --;
l ++;}}printf("%d\n", ans);for(int i =1; i <= n; i ++){if(i >= ansL && i <= ansR)printf("1");elseprintf("%d", a[i]);printf("%c"," \n"[i == n]);}}return0;}
思路2_二分法
我们用数组的1 - n来存储0 和 1
我们开一个num_one数组,num_one[ i ]: 表示从开始位置到现在为止一共有多少个1。
这个数组的用处是 i - num_one[ i ] 就是开始到 i 位置需要添多少个0能使得 i 之前全是1
【二分/尺取】Educational Codeforces Round 11_C. Hard Process
Educational Codeforces Round 11_C. Hard Process题意:长为n的一个数组,只有0 和 1,问任意填补 k 个0,能使得1连续的最大长度是多少。思路1_尺取法:先使得“尺”的左右端点为l = 1, r = 1左右端点在n的范围内的时候,保证我们“尺”上全是1,并且“尺”中的添加的0的个数在k的范围之内,同时更新答案。如果在保证“尺”上全是...