HDU 5037
要求:M米长的河,里面有N块石头,青蛙每次最多跳L米,增加若干个石头尽可能使青蛙跳的步数最多,青蛙想跳得最少。
方法:贪心、初值设置问题。sort!!!!!!
1.青蛙会从当前位置跳到L米以内的最远位置。
2.在刚刚跳不到的L+1米内跳两次可使青蛙跳得尽可能多。这个想一想就知道了。
简单分析一下,假设青蛙跳不到下一块距离很远的石头,此时需要放置若干块石头让青蛙可以跳过去,青蛙最远可以跳L米,应该在L米之内放一个,然后再将将跳不到的L+1米处放一个,若没有放在L+1米处放在了L米的范围内,参见第1条会跳过L米内放置的第1个石头直接跳到这块石头。
3.因此原有的相邻的两块石头之间的距离均可分为x+y*(L+1)。
4.跳每个间隔时加上2*y。
5.只剩下分析x的问题了,需引入一个temp存入上一段的x,这是一个累加效应,若几段x都很小,加起来不到L,就会被一步跳过去,当temp+x>L时,需要还债,加上1步,并用temp存这一段的x,继续向前跳。
6.最后会发现一个小问题叫做最开始的temp设置为多少,发现假如只有一个很小的x,则跳0步,不符合实际,设置初值为L即可,这个初值真的是很难想到。
7.最后一个很小的一直WA的问题是题目中没有说石头是按顺序从小到大摆放的,需要使用sort!!!!!!
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[200001];
int main()
{
int t,n,m,l,i,j,ans,temp,x,y;
scanf("%d",&t);
for(j=1;j<=t;j++)
{
scanf("%d%d%d",&n,&m,&l);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
a[0]=0,a[++n]=m;
ans=0;
temp=l;
sort(a,a+n);
for(i=1;i<=n;i++)
{
x=(a[i]-a[i-1])%(l+1);
y=(a[i]-a[i-1])/(l+1);
if(temp+x>=l+1)
{
temp=x;
ans+=(2*y+1);
}
else
{
temp+=x;
ans+=(2*y);
}
}
printf("Case #%d: %d\n",j,ans);
}
}