“玲珑杯”线上赛 Round #15 河南专场 C咸鱼魔法记

来源:互联网 发布:java 反射调用set方法 编辑:程序博客网 时间:2024/05/06 13:37

C – 咸鱼魔法记
Time Limit:1s Memory Limit:128MByte

Submissions:394Solved:137

DESCRIPTION
给你一个01串,我们定义这个串的咸鱼值,是最长的全1串。现在你最多可以使用K次咸鱼魔法,每次魔法,你可以使得一个位置翻转(0变成1,1变成0)。问你这个串的咸鱼值最多是多少。

INPUT
第一行两个整数N,K。表示串的长度和可以施展咸鱼魔法的次数。(N,K<=300000)
第二行N个01整数。
OUTPUT
输出答案。
SAMPLE INPUT
10 2
1 0 0 1 0 1 0 1 0 1
SAMPLE OUTPUT
5
瞎想的方法,就对了,但是re了两法,以为是数组开小了。
但是忘了还可能数组越界
把0的位置全都找出来,然后k范围内的0聚集到一起,最终1的数量越多,那么最终就是答案

#include<cstdio>#include<queue>#include<cmath>#include<cstring>#include<string>#include<vector>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;#define LL long long intconst int inf=0x3f3f3f3f;int a[400000];int b[400000];int main(){    int n,k;    while(~scanf("%d%d",&n,&k))    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        int ans=-1;        int len=0;        for(int i=1; i<=n; i++)        {            //printf("%d\n",a[i]);            scanf("%d",&a[i]);            if(a[i]==0)                b[len++]=i;        }        //printf("%d\n",len);        if(len<=k&&k%2==1)        {            printf("%d\n",n-1);        }        else if(len<=k&&k%2==0)        {            printf("%d\n",n);        }        else        {            ans=b[k]-1;            //printf("%d\n",ans);            for(int i=1; i+k<=len-1; i++)            {                ans=max(ans,(((b[i+k]-1)-(b[i-1]+1))+1));                //printf("%d\n",ans);            }            //printf("zxy %d\n",b[len-k-1]+1);            ans=max(ans,(n-(b[len-k-1]+1)+1));            printf("%d\n",ans);        }    }    return 0;}
阅读全文
0 0