http://acm.hdu.edu.cn/showproblem.php?pid=2059
只要求出乌龟跑到终点的地方最短时间和兔子的时间,相比较。
用动态规划求乌龟的时间,把起点和终点也看作一个站点,用dp[i]来保存到这个站点的最短时间,dp[N+1]的时间就是乌龟的时间。
比较是否停的关键是两个站点的路程:
double temp = T / ((double)1 / VT2 - (double)1 / VT1);
大于temp就要停,小于temp不停。
还有个注意点是时间用double表示
#include<iostream>
using namespace std;
struct box
{
int p;
double time;
}dp[101];
int L, N, C, T, VR, VT1, VT2;
double time1, time2;
void find(){
for (int i = 1; i <= N + 1; i++){
if (dp[i].p <= C){
dp[i].time = (double)dp[i].p / VT1;
continue;
}
else dp[i].time = (double)C / VT1 + (double)(dp[i].p - C) / VT2;
for (int j = 1; j < i; j++){
double temp = T / ((double)1 / VT2 - (double)1 / VT1);
double temp2 = dp[i].p - dp[j].p;
if (temp2>C){
time2 =T+ dp[j].time + (double)C / VT1 + (double)(temp2 - C) / VT2;
}
else if (temp2<temp)
{
time2 = dp[j].time + (double)temp2 / VT2;
}
else
{
time2 = dp[j].time + T + (double)temp2 / VT1;
}
if (time2 < dp[i].time) dp[i].time = time2;
}
}
}
int main(){
while (cin>>L)
{
cin >> N >> C >> T >> VR >> VT1 >> VT2;
for (int i = 1; i <= N; i++){
cin >> dp[i].p;
dp[i].time = 0;
}
dp[0].p = dp[0].time = dp[N + 1].time = 0;
dp[N + 1].p = L;
find();
time1 = (double)L / VR;
if (dp[N + 1].time < time1) cout << "What a pity rabbit!" << endl;
else cout << "Good job,rabbit!" << endl;
}
return 0;
}