http://acm.hdu.edu.cn/showproblem.php?pid=2059
#include<iostream>
using namespace std;
struct Node
  {
double tim;
double ls;
};
int main()
  {
double S;
while(cin>>S)
 {
int n,i,j;
double L,time,rv,tortoiseC,tortoiseQ,pos[103];
Node dp[103],temp;
double d,d1,d2,t1,t2;
cin>>n>>L>>time;
cin>>rv>>tortoiseQ>>tortoiseC;
for(i=1;i<=n;i++)
cin>>pos[i];
if(tortoiseQ<=tortoiseC)//騎車不如蹬車
 {
if(S/tortoiseC>S/rv)
cout<<"Good job,rabbit!"<<endl;
else
cout<<"What a pity rabbit!"<<endl;
continue;
}
dp[0].tim=0;
dp[0].ls=L;
pos[0]=0;//一定要賦初值,否則其默認(rèn)初值為負(fù)數(shù),因為是double類型
pos[n+1]=S;
for(i=1;i<=n+1;i++)
 {
dp[i].tim=100000000;
dp[i].ls=0;
for(j=0;j<i;j++)//從出發(fā)點開始到i站之前選擇一個最優(yōu)的
 {
d=pos[i]-pos[j];
if(dp[j].ls>=d)//無需充電
 {
temp.tim=dp[j].tim+d/tortoiseQ;
temp.ls=dp[j].ls-d;
}
else
 {
t1=dp[j].tim+dp[j].ls/tortoiseQ+(d-dp[j].ls)/tortoiseC;
d1=0;
if(L>=d)//充電夠用情況
 {
t2=dp[j].tim+time+d/tortoiseQ;
d2=L-d;
}
else//充電不夠用情況
 {
t2=dp[j].tim+time+L/tortoiseQ+(d-L)/tortoiseC;
d2=0;
}

if(t1<t2)//選擇時間最少的
 {
temp.tim=t1;
temp.ls=d1;
}
else
 {
temp.tim=t2;
temp.ls=d2;
}
}
if(temp.tim < dp[i].tim)
 {
dp[i].tim=temp.tim;
dp[i].ls=temp.ls;
}
}//for(j=0;j<i;j++)
}//for(i=1;i<=n+1;i++)
if(dp[n+1].tim>S/rv)
cout<<"Good job,rabbit!"<<endl;
else
cout<<"What a pity rabbit!"<<endl;
}
return 0;
}
|