Hdu 2059 龟兔赛跑

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值