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