如题可知,兔子比赛的时间已知,就是判断乌龟用时是否小于兔兔。
我们可以将每个充电站以及起点和终点视为状态点,那就可以开一个Time_turtle[N+2]的数组来存储在每个充电站时的最优时间。
其状态转移方程为 Time_turtle[i]=Time_turtle[j]+min{充电[j],不充电[j]}; (从j点到i点的最佳时间为j点之前的最佳时间,加上选择充电或者不充电时的最小时间)
值得注意地是,每点的状态选择后实际上会影响后续的所有选择,所以要开一个二重循环。顺着枚举每个充电站i,然后在倒着枚举i前面的j个充电站的状态来进行比较。
#include <iostream>
using namespace std;
double min(double x,double y){
return x>y?y:x;
} //判断大小
int main(){
double T,C,L,vr,vt1,vt2;int N;
while(cin>>L){
cin>>N>>C>>T;
cin>>vr>>vt1>>vt2;
double time_rabbit=L/vr;
//存储每个充电站之间的距离。
double s[102];
for(int i=1;i<=N;i++){
cin>>s[i];
}
s[0]=0,s[N+1]=L; //记录起点和终点的位置
double Time_turtle[102]={0},time;
//Time_turtle为动态规划数组,记录到每个收费站时的最小时间
//起点时为时间为0;
//第一重循环表示在第i充电站时,
for(int i=1;i<N+2;i++){
Time_turtle[i]=0xffffff; //由于初始,i点的最小值未知故设为无穷大
for(int j=0;j<i;j++){
if(s[i]-s[j]<C)time=(s[i]-s[j])/vt1; //比较i点收费站到j点距离与充电最大行驶距离的大小
else time=(s[i]-s[j]-C)/vt2+C/vt1; //大于则直接除以充电速度,否则要加上用脚蹬的时间
time+=Time_turtle[j]; //默认j后的点均为不充电,加上j前的点的最优时间
if(j>0)time+=T; //由于起点是充满电的,所以要判断一下
Time_turtle[i]=min(Time_turtle[i],time); //比较的是不充电时和充电时那个更小。
}
} //存储最优化的时间
//cout<<Time_turtle[N+1]<<" "<<time_rabbit<<endl;
if(Time_turtle[N+1]<time_rabbit)cout<<"What a pity rabbit!\n";
else cout<<"Good job,rabbit!\n";
}
return 0;
}