题中有N个充电站,我们另外添加两个充电站,一个在起点,另一个在终点,则可以定义DP:
状态:dp[i]表示到达第i个充电站所需的最短时间。
状态转移方程:dp[i]=min(dp[j]+T)+第j个充电站到第i个充电站的时间。
这里加T是表示从j充满电后出发到i。
注意:不必考虑在第k个充电站没充电的情况,因为这种情况其实已经涵盖在k之前的状态了。举个例子,假如在上述转移方程中,我们找到了min(dp[j]+T)对于的充电站编号为j,现设k为(j,i)之中某个充电站,则在j充满电后直接跑到i,一定会经过k,这时是不会在k充电的,因此说没充电的情况已经被之前的状态涵盖了。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const double inf=100000000000.0;
double dp[105],p[105];
int main()
{
int L;
while(cin>>L)
{
int n,c,t;
cin>>n>>c>>t;
double vr,vt1,vt2;
cin>>vr>>vt1>>vt2;
for(int i=1;i<=n;i++)
cin>>p[i];
p[n+1]=L*1.0; p[0]=0.0;
dp[0]=0.0;
for(int i=1;i<=n+1;++i)
{
dp[i]=inf;
for(int j=0;j<i;++j)
{
double temp=0.0;
if(p[i]-p[j]<=(double)c)
temp=(p[i]-p[j])/vt1;
else temp=(double)c/vt1+(p[i]-p[j]-(double)c)/vt2;
if(j) temp+=t;
dp[i]=min(dp[i],dp[j]+temp);
}
}
if(dp[n+1]<(double)L/vr) cout<<"What a pity rabbit!\n";
else cout<<"Good job,rabbit!\n";
}
return 0;
}