CF660C:尺取法

题意:

  • 最多改变k个0为1,是连续的1的个数最大。
  • 输出反转的个数,和反转后的序列。

题解:尺取法

代码

#include <bits/stdc++.h>
using namespace std;
int const N = 300000 + 10;
int n,k;
int a[N];
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	int l = 1,r = 0,rr = 0,ll = -1,cnt = 0;   //注意初始化
	while(r <= n){
		if(rr - ll < r - l){
			rr = r;
			ll = l;
		}
		if(a[++r] == 0)	cnt++;
		while(cnt > k){
			if(a[l++] == 0)	cnt--;
		}
	}
	printf("%d\n",rr-ll+1);
	for(int i=1;i<=n;i++){
		if(ll <=i && i <= rr)	printf("%d ",1);
		else printf("%d ",a[i]);
	}
	cout<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42264485/article/details/88827317
今日推荐