只需求出乌龟最短耗时跟兔子耗时比即可
将起点 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]与兔子耗时对比
#include<iostream> #include<algorithm> using namespace std; int main(){ int L,N,C,T,VR,VT1,VT2,p[105],i,j,dis; double time,dp[105]; while(cin>>L>>N>>C>>T>>VR>>VT1>>VT2){ for(i=1;i<=N;i++) cin>>p[i]; p[0]=0; p[N+1]=L; fill(dp,dp+105,1e9); dp[0]=0.0; for(i=1;i<=N+1;i++) for(j=0;j<i;j++){ time=T; dis=p[i]-p[j]; if(!j) time=0.0; if(dis<=C) time+=1.0*dis/VT1; else time+=1.0*C/VT1+1.0*(dis-C)/VT2; dp[i]=min(dp[i],dp[j]+min(time,1.0*dis/VT2)); } if(dp[N+1]<1.0*L/VR) cout<<"What a pity rabbit!\n"; else cout<<"Good job,rabbit!\n"; } return 0; }