题目描述
有L个苹果和香蕉排成一条直线,其中有N个香蕉,你可以使用至多M次魔法道具将香蕉变成苹果,最后“最长的连续苹果数量”即为你本次苹果消消乐的得分。
给定苹果和香蕉的排列,求你能获得的最大得分。
输入
第一行是3个整数N、M和L,表示香蕉的数量,魔法道具使用次数,以及苹果和香蕉的总数。
第二行包含N个整数a1, a2, ... aN(1 <= a1 < a2 < ... < aN<= L),表示第a1, a2, ... aN个位置上摆放的是香蕉,其余位置摆放的都是苹果。
输出
输出通过使用魔法道具后你能获得的最大得分。
样例输入 Copy
5 2 100 10 30 55 56 90
样例输出 Copy
59
提示
【样例1解释】
消掉55和56两个香蕉,从31到89都是苹果,所以连续苹果数量为59
【数据范围】
对于30%的数据,1<=L<=100,0<=N,M<=10
对于70%的数据,1<=L<=50000,0<=N,M<=1000
其中有20%的数据,M=0
另有10%的数据,N<=M
对于100%的数据,1<=L<=1000000,0<=N,M<=100000
分析:
消去香蕉肯定消去连着的香蕉。 消去区间 x到x+m的香蕉,遍历一次。
代码:
#include <iostream>
using namespace std;
int main ()
{
int b,m,a;
scanf("%d%d%d",&b,&m,&a);
int location[b+2];
for(int i=1;i<=b;i++)scanf("%d",&location[i]);
location[0]=0;
location[b+1]=a+1;
int l=1,r=m;
int res=0;
if(m>=a)
{
printf("%d\n",a);
return 0;
}
while(r<=b)
{
res=max(res,location[r+1]-location[l-1]-1); //后面这个是消去m个香蕉后连续苹果的数。
l++;
r++;
}
printf("%d\n",res);
return 0;
}