Good job,rabbit!
What a pity rabbit!
解析:动态规划比较经典的一题,起点作为起始站,标记为0,N个充电站,分别标记为1,2,3.........N,终点为最后一站,标记为N+1,两层循环,第一层i表示到达第i 站所需花费的最短时间,第二层j 表示在j 点充电后到i的时间(j到i之间不会再充电),计算j到i的时间要注意两者的距离是否大于电动车最大骑行距离,而且如果j是0,则不需要加上充电的时间。最后输出dp[N+1]即可。
代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=1000000007;
const double eps=0.00000001;
int L,N,rundist,powertime;
int rabbitspeed,drivespeed,ridespeed;
int loc[105];
double dp[105];
double run(int x,int y)
{
double ret=0;
if(x!=0) ret+=(double)powertime; //不是起点才加上充电时间
if(loc[y]-loc[x]<=rundist) ret+=(loc[y]-loc[x])*1.0/drivespeed; //判断是否大于最大骑行距离
else ret+=rundist*1.0/drivespeed+(loc[y]-loc[x]-rundist)*1.0/ridespeed;
return ret;
}
int main()
{
while(cin>>L)
{
cin>>N>>rundist>>powertime; //输入
cin>>rabbitspeed>>drivespeed>>ridespeed;
for(int i=1;i<=N;i++) scanf("%d",&loc[i]);
loc[0]=0,loc[N+1]=L; //起点,终点
for(int i=0;i<104;i++) dp[i]=1000000007.0;
dp[0]=0.0;
for(int i=1;i<=N+1;i++)
for(int j=0;j<i;j++)
dp[i]=min(dp[i],dp[j]+run(j,i)); //加上两点之间所需的时间
if(dp[N+1]<L*1.0/rabbitspeed) cout<<"What a pity rabbit!"<<endl;
else cout<<"Good job,rabbit!"<<endl;
}
return 0;
}