C -- 咸鱼魔法记
Time Limit:1s Memory Limit:128MByte
Submissions:388Solved:135
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
解题思路:使用魔法要对连续的非0位置使用,使连起的1尽可能多。
#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
const int maxn = 3000010;
int N,K;
int zero[maxn];
int main()
{
int temp;
while(~scanf("%d%d",&N,&K))
{
int index = 1;
int num = 0;
int ans = 0;
zero[0] = 0;
for(int i = 1; i <= N; i++)
{
scanf("%d",&temp);
if(temp == 0) ///把是0的位置记录下来。
{
zero[index] = i;
index++;
ans = max(ans,num);
num = 0;
}
else
{
num++;
}
}
if(K == 0) ///K=0,则答案是串中连续1的最大个数
printf("%d\n",ans);
else if(index-1<=K) ///K大于等于0的个数,答案是N
printf("%d\n",N);
else ///其他情况
{
///i->i+k->i+k+1时,到i+k+1个0时,魔法才不够用,
for(int i = K+1; i < index; i++)
{
ans = max(ans,zero[i]-zero[i-K-1]-1);
}
printf("%d\n",ans);
}
}
return 0;
}