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]与兔子耗时对比

#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;
}
原文地址:https://www.cnblogs.com/stelayuri/p/12213260.html