Hdu 2059 龟兔赛跑

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_25673113/article/details/50612208

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;
}
展开阅读全文

没有更多推荐了,返回首页