hdu_2059 龟兔赛跑

来源:互联网 发布:有声小说阅读软件 编辑:程序博客网 时间:2024/05/01 09:16

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059

分析:

        要看谁赢谁输,只要看他们分别抵达终点的时间就可以了。

       兔子的时间容易算  time1=L/VR;

       乌龟的时间 time2,就是一个DP问题了。

        p[i],存第i个充电站的位置。做预处理,

        p[0]=0   //假设出发点是一个充电站。

                  p[N+1]=L,   //假设终点是一个充电站。

         Dp[i],存到第i个充电站有的最短时间。故我们要求得DP[N+1];


        这里我们求到第3个充电站用地最短时间;

        在第二充电站时,有充电或者不充电到达dp[3];  两电站之间的距离 Len=p[3]-p[2]

          不充电用时  : T1=Len/VT2;

          充电用时:    T2=T   //充电用时

                  C < Len : T2=C/VT1+(Len-C)/VT2;    //充电后走这段路用时

                  C >= Len : T2=Len/VT2;   //充电后走这段路用时

         所以又 DP[3]=DP[2]+min(T1,T2);

     同理我们还要比较从dp[1],dp[3],的情况;从dp[0],dp[3],的情况。使其得到一个最短的DP[3];

我的代码:

#include<stdio.h>int L;int N,C,T;int VR,VT1,VT2;int p[110];double dp[110];double  min(double a,double b){    return a>b?b:a;}int main(){    while(scanf("%d",&L)!=EOF)    {        scanf("%d%d%d",&N,&C,&T);        scanf("%d%d%d",&VR,&VT1,&VT2);        for(int i=1;i<=N;i++) scanf("%d",p+i);        p[0]=0;        p[N+1]=L;        for(int i=0;i<=N+1;i++) dp[i]=0xffffff; //找最下值,赋最大初始值。        dp[0]=0.0;        for(int i=1;i<=N+1;i++)        {            for(int j=0;j<i;j++){                int len=p[i]-p[j];                double time2=1.0*len/VT2; //不充电用时                double time1 =T    ; //充电用时                if(j==0) time1=0.0;   //从起点出发,不用充电时间。                if(len<=C)                    time1+=1.0*len/VT1;                else                    time1+=1.0*C/VT1+1.0*(len-C)/VT2;                double time=min(time1,time2);                dp[i]=min(dp[i],dp[j]+time);            }        }        double rab_t=1.0*L/VR;        if(rab_t>dp[N+1])  //兔子用时大于乌龟用时。        {            printf("What a pity rabbit!\n");        }        else        {            printf("Good job,rabbit!\n");        }    }    return 0;}

总结:注意从出发点开始的时候,不用加充电的时间T。