hdu 2059 龟兔赛跑(简单DP)

题目链接

题意:题目很有趣,也没有刁难的地方!
  按由近至远给出了充电站到起点的距离(0<dist[1]<dist[2]…<dist[n]<L),
和兔子的速度vr,乌龟的自行车充电的速度vt1、没有充电的速度vt2,自行车充
电后最远行驶距离C,充电花费的时间time,问乌龟采取最优的策略,兔子赢了,
输出“Good job,rabbit!”,输了,输出“What a pity rabbit!”。

用F[i] 记录下跑到第i个充电站充好电所花费的最少时间.
状态转移方程即为:

F[i]=min(F[i],F[j]+1.0*d/vt1+1.0*(tot-d)/vt2);(all j<i)
//d表示从第j个充电站vt1速度跑的距离,tot-d即表示vt2速度跑的距离
//即表示第j+1至i-1充电站不充电
//结束后,在+time,表示充电

时间复杂度O(n^2)

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#define llt long long
using namespace std;

double F[110];//表示: 跑到第i个充电站充电所花费的最小时间;
int dist[110];
int main(){

    int L;
    while(~scanf("%d",&L)){
        //输入部分
        int num,C,time;
        scanf("%d%d%d",&num,&C,&time);
        int vr,vt1,vt2;
        scanf("%d%d%d",&vr,&vt1,&vt2);
        for(int i=1;i<=num;++i)
            scanf("%d",&dist[i]);

        //两重循环!

        dist[++num]=L;F[0]=0;
        for(int i=1;i<=num;++i){
            F[i]=1e9;
            for(int j=0;j<i;++j){
                int tot=dist[i]-dist[j];
                int d=(tot>C)?C:tot;//加速跑的距离;

                F[i]=min(F[i],F[j]+1.0*d/vt1+1.0*(tot-d)/vt2);//判断是否跑到“第j个充好电后,后面不再充电“费时少;
            }
            F[i]+=time;
        }
        F[num]-=time;
        //cout<<F[num]<<endl;
        if(F[num]>1.0*L/vr)
            puts("Good job,rabbit!");
        else puts("What a pity rabbit!");

    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值