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

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 int
const 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
",a[i]);
            scanf("%d",&a[i]);
            if(a[i]==0)
                b[len++]=i;
        }
        //printf("%d
",len);
        if(len<=k&&k%2==1)
        {
            printf("%d
",n-1);
        }
        else if(len<=k&&k%2==0)
        {
            printf("%d
",n);
        }
        else
        {

            ans=b[k]-1;
            //printf("%d
",ans);
            for(int i=1; i+k<=len-1; i++)
            {
                ans=max(ans,(((b[i+k]-1)-(b[i-1]+1))+1));
                //printf("%d
",ans);
            }
            //printf("zxy %d
",b[len-k-1]+1);
            ans=max(ans,(n-(b[len-k-1]+1)+1));
            printf("%d
",ans);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zxy160/p/7215098.html