http://acm.hdu.edu.cn/showproblem.php?pid=2059
这题想了很久,感觉有了一点点想法了,然后就去写,写到一半才发现自己的想法有问题,没办法了,去看了看别人的题解,才发现自己把题想的太复杂了。
用dp[i]来记录到第i个加油站所用的最小时间,则dp[i] 为第j个加油站直接到第i个加油站的时间加上dp[j],0<= j <i;
把起点和终点初始化为第0个和第n+1个加油站。
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <fstream>
using namespace std;
#define int64 __int64
#define ll long long
#define M 10005
double len , c , t , vr , vt1 , vt2;
int n;
double dp[M] ,arr[M];
double Solve()
{
int i , j;
arr[0] = 0;
arr[n+1] = len;
for (i = 1 ; i <= n+1 ; i++)
{
double MIN = 1<<30;
for (j = 0 ; j < i ; j++)
{
double tmp = arr[i]-arr[j];
tmp = tmp>c ? c/vt1+(tmp-c)/vt2 : tmp/vt1;
if (j != 0)
tmp += t;
MIN = min(MIN,tmp+dp[j]);
}
dp[i] = MIN;
}
return dp[n+1];
}
int main()
{
while (~scanf("%lf",&len))
{
scanf("%d%lf%lf",&n,&c,&t);
scanf("%lf%lf%lf",&vr,&vt1,&vt2);
for (int i = 1 ; i <= n ; i++)scanf("%lf",arr+i);
if (Solve() > 1.0*len/vr)
printf("Good job,rabbit!\n");
else
printf("What a pity rabbit!\n");
}
return 0;
}