题目链接:http://www.ifrog.cc/acm/problem/1124
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
int a[maxn];
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int l=1,r=1,ans=0;
for(int i=1;i<=n;i++){
if(a[i]==0&&!k){
break;
}
if(a[i]==0) k--;
r++;
}
ans=max(ans,r-l);
for(int i=r;i<=n;i++){
//[l,i-1],中间一定存在k个零。
if(a[i]==0){ //现在下一位还是零,说明已经有k+1个0了,
ans=max(ans,i-l); //计算此时当前位0之前所能满足的最大区间。
while(a[l]==1) l++; //因为下一步已经存在k+1个0了,所以l指针处为1的话直接向后移位直到出现0为止,因为后面的i位的0要前面的已经填上的1来弥补,所以现在来连续的已经匹配不上了。
l++; //之前补上的1拿走放在后面。
}
}
ans=max(ans,n-l+1);
printf("%d\n",ans);
return 0;
}