151 丝雨姐的入门day1枚举贪心 K题 贪心 初值设置问题 以后再看看 题中未说按顺序就是需要sort

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

猜你喜欢

转载自blog.csdn.net/Irving0323/article/details/81781026