ZJNU 1130 - 龟兔赛跑——中高级

只需求出乌龟最短耗时跟兔子耗时比即可
将起点 0 和终点 N+1 也看做充电站,进行动态规划
对第i个点进行动态规划,则可以得到状态转移方程为
dp[i] = max{dp[j]+time[i][j]} j∈[0,i]
time[i][j]=max(不充电从i到j耗时 , 在i充满电后再到j耗时)
最后将dp[N+1]与兔子耗时对比

 1 /*
 2 Written By. StelaYuri
 3 */
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 int main(){
 8     int L,N,C,T,VR,VT1,VT2,p[105],i,j,dis;
 9     double time,dp[105];
10     while(cin>>L>>N>>C>>T>>VR>>VT1>>VT2){
11         for(i=1;i<=N;i++)
12             cin>>p[i];
13         p[0]=0;
14         p[N+1]=L;
15         fill(dp,dp+105,1e9);
16         dp[0]=0.0;
17         for(i=1;i<=N+1;i++)
18             for(j=0;j<i;j++){
19                 time=T;
20                 dis=p[i]-p[j];
21                 if(!j)
22                     time=0.0;
23                 if(dis<=C)
24                     time+=1.0*dis/VT1;
25                 else
26                     time+=1.0*C/VT1+1.0*(dis-C)/VT2;
27                 dp[i]=min(dp[i],dp[j]+min(time,1.0*dis/VT2));
28             }
29         if(dp[N+1]<1.0*L/VR)
30             cout<<"What a pity rabbit!\n";
31         else
32             cout<<"Good job,rabbit!\n";
33     }
34     
35     return 0;
36 }

猜你喜欢

转载自www.cnblogs.com/stelayuri/p/12213260.html