题意:聪明的青蛙过河,河宽M,河里原本有N个石头,青蛙最大步长为L,你是一个上帝,既想让青蛙过河又不想让它那么轻松地过河,为了使青蛙能够以最大步数过河,作为上帝就向河里放置石块(上帝的石块无限多个),求青蛙在你投放石块的情况下过河的最大步数。
解题思路:首先直接考虑什么情况下可以让青蛙跳到你放置的石块上,当青蛙当前的位置P与下一个相邻位置a[i]的距离大于等于(L+1)时,青蛙需要跳两步,而且在这种情况下要保证青蛙在上一个位置last无法直接跳到a[i],如果上一个位置last与下一个位置a[i]距离大于L,则上一个位置last移动到当前位置P+(a[i]-P)/(L+1)*(L+1);P 移动到a[i]的位置,步数j加1。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn = 200010;
int a[maxn];
int main()
{
int T,N,M,L,p,ans,last;
scanf("%d",&T);
for(int i = 1; i <= T; i++)
{
scanf("%d%d%d",&N,&M,&L);
for(int k = 0; k < N; k++)
scanf("%d",&a[k]);
sort(a,a+N);
a[N] = M;
p = 0,ans = 0,last = -L;
for(int j = 0; j <= N; j++)
{
ans +=(a[j]-p)/(L+1)*2;
last +=(a[j]-p)/(L+1)*(L+1);
if(a[j]-last > L)
{
last = p+(a[j]-p)/(L+1)*(L+1);
p = a[j];
ans++;
}
else p = a[j];
}
printf("Case #%d: %d\n",i,ans);
}
return 0;
}