题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059
思路(看别人博客。。):把起点和终点也看做充电站,假设现在在第i个充电站,那么dp[i]=min(第0个充电站加满电到第i个充电站所用时间,第1个充电站加满电到第i个充电站所用时间……第i - 1个充电站加满电到第i个充电站所用时间),然后用dp[n + 1] 和兔子所用的时间比一下就好了。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define Max 0x3f3f3f3f
int p[105];
int n,c,t;
int vr,vt1,vt2;
double dp[105];
int L;
int main()
{
while(~scanf("%d",&L))
{
memset(p,0,sizeof p);
memset(dp,0,sizeof dp);
scanf("%d%d%d",&n,&c,&t);
scanf("%d%d%d",&vr,&vt1,&vt2);
for(int i = 1;i <= n;++i)
scanf("%d",&p[i]);
p[0] = 0;
p[n + 1] = L;
dp[0] = 0;
for(int i = 1;i <= n + 1;++i)
{
dp[i] = Max;
for(int j = 0;j < i;++j)
{
double temp;
int len = p[i] - p[j] ;
if(len < c)
temp = (double)(len) / vt1;
else
temp = (double)(c) / vt1 + (double)(len - c) / vt2;
if(j)
temp += t;
dp[i] = min(dp[i],dp[j] + temp);
}
}
double tuzitime = (double)(L) / vr;
if(dp[n + 1] < tuzitime)
printf("What a pity rabbit!\n");
else
printf("Good job,rabbit!\n");
}
return 0;
}