SCU 4107 consecutive

来源:互联网 发布:windows字体文件 编辑:程序博客网 时间:2024/06/07 18:19

。。明天要大川大校赛。。

趁机把他们的初赛题看了下。。

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;}

原创粉丝点击