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;
}

猜你喜欢

转载自blog.csdn.net/qq_38786088/article/details/79895658