HDU

http://acm.hdu.edu.cn/showproblem.php?pid=2059

初始把起点和终点也算做充电站,设dp[i]是到第i个充电站的最短时间,那么dp[n+1]即是乌龟到达终点的最短时间.

每次到达第i个点,j:0-i-1;去找能不能用从第j个充电站直接到达 i 来更新最短时间。

注意细节处理.

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 const double inf = 0xfffffff;
 6 int N;
 7 double L,C,T;
 8 double vr,vt1,vt2;
 9 double s[150];
10 double dp[150];
11 
12 int main()
13 {
14     //freopen("a.txt","r",stdin);
15     while(~scanf("%lf",&L))
16     {
17         scanf("%d%lf%lf",&N,&C,&T);
18         scanf("%lf%lf%lf",&vr,&vt1,&vt2);
19         for(int i=1;i<=N;i++)
20             scanf("%lf",&s[i]);
21         s[0]=0;s[N+1]=L; //把起点和终点当成充电站,方便处理
22         dp[0]=0;//第0个充电站的最短距离为0
23         double m=0;
24         for(int i=1;i<=N+1;i++)
25         {
26             dp[i]=inf;  //初始为 无穷大
27             for(int j=0;j<i;j++)
28             {
29                 m=0;
30                 int x=s[i]-s[j];
31                 if(x>C)  //第i个充电站到第j个充电站的距离 > C
32                 {   //把电动车行驶的时间加上乌龟用脚踏的时间
33                     m=C/vt1+(x-C)/vt2;
34                 }
35                 else m=x/vt1;//直接加上这段距离除于电动车的速度所得的时间
36                 if(j>0)
37                 {//这里判断j>0是因为如果j==0的话,即表明从起点出发,因为起点已经充满电了所以不需要加上电动车的充电时间
38                     m+=T;
39                 }
40                 m+=dp[j];//之后加上到第j个加电站的最优时间
41               //  printf("%.0lf
",m);
42                 dp[i]=min(m,dp[i]);
43             }
44           //  printf("%.0lf
",dp[i]);
45         }
46         if(dp[N+1]>(L/vr)) printf("Good job,rabbit!
");
47         else printf("What a pity rabbit!
");
48     }
49     return 0;
50 }
原文地址:https://www.cnblogs.com/nowandforever/p/4567196.html