。。明天要大川大校赛。。
趁机把他们的初赛题看了下。。
A了6个水题。。
好吧。。
只是里面的某一题。。
题目链接:http://zuojie.3322.org:88/soj/problem.action?id=4107
题意:给定一个最长10W的只含0,1的序列,你可以将K个0改成1,求更改后的最长连续的全1序列。
貌似很简单的样子。。
类似队列的解法。。始终保证这个队列中的0的数量为K。。记录这个队列的最长长度。。每次循环队列左端都要右移1个。。复杂度是O(N)的。。注意判断序列中0的个数的时候要用到前缀和的预处理来解决。。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
int num[100011]={0};
int sum[100011]={0};
for(int i=1;i<=n;i++)
scanf("%d",num+i);
sum[1]=num[1];
for(int i=2;i<=n;i++)
sum[i]=sum[i-1]+num[i];
int x,y;
x=1,y=1;
int res=0;
while(y<=n)
{
while((num[y+1]==1)||(y-x+1-(sum[y]-sum[x-1])<k))
y++;
res=max(res,min(n,y)-x+1);
x++;
}
printf("%d\n",res);
}
return 0;
}