题意:题目很有趣,也没有刁难的地方!
按由近至远给出了充电站到起点的距离(0<dist[1]<dist[2]…<dist[n]<L),
和兔子的速度vr,乌龟的自行车充电的速度vt1、没有充电的速度vt2,自行车充
电后最远行驶距离C,充电花费的时间time,问乌龟采取最优的策略,兔子赢了,
输出“Good job,rabbit!”,输了,输出“What a pity rabbit!”。
用F[i] 记录下跑到第i个充电站充好电所花费的最少时间.
状态转移方程即为:
F[i]=min(F[i],F[j]+1.0*d/vt1+1.0*(tot-d)/vt2);(all j<i)
//d表示从第j个充电站vt1速度跑的距离,tot-d即表示vt2速度跑的距离
//即表示第j+1至i-1充电站不充电
//结束后,在+time,表示充电
时间复杂度O(n^2)
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#define llt long long
using namespace std;
double F[110];//表示: 跑到第i个充电站充电所花费的最小时间;
int dist[110];
int main(){
int L;
while(~scanf("%d",&L)){
//输入部分
int num,C,time;
scanf("%d%d%d",&num,&C,&time);
int vr,vt1,vt2;
scanf("%d%d%d",&vr,&vt1,&vt2);
for(int i=1;i<=num;++i)
scanf("%d",&dist[i]);
//两重循环!
dist[++num]=L;F[0]=0;
for(int i=1;i<=num;++i){
F[i]=1e9;
for(int j=0;j<i;++j){
int tot=dist[i]-dist[j];
int d=(tot>C)?C:tot;//加速跑的距离;
F[i]=min(F[i],F[j]+1.0*d/vt1+1.0*(tot-d)/vt2);//判断是否跑到“第j个充好电后,后面不再充电“费时少;
}
F[i]+=time;
}
F[num]-=time;
//cout<<F[num]<<endl;
if(F[num]>1.0*L/vr)
puts("Good job,rabbit!");
else puts("What a pity rabbit!");
}
return 0;
}