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\n",m); 42 dp[i]=min(m,dp[i]); 43 } 44 // printf("%.0lf\n",dp[i]); 45 } 46 if(dp[N+1]>(L/vr)) printf("Good job,rabbit!\n"); 47 else printf("What a pity rabbit!\n"); 48 } 49 return 0; 50 }
时间: 2024-11-19 10:30:31