思路:定义从i->j为在第i个站点充完电直接到达第j个站点(假设终点为第n+1个站点),i可以使小于j的任何站点,j从1增加到第n+1,所以time[n+1]=min(time[n+1],time[i]+T),T为从i到j的所花的时间.
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 99999999
using namespace std;
const int MAX=102;
double Time[MAX],p[MAX];//time表示到达从第i个充电站充完电直达第i个充电站所需要的最少时间
int main(){
int n;
double c,t,vr,vt1,vt2,l;
while(cin>>l){
cin>>n>>c>>t>>vr>>vt1>>vt2;
for(int i=1;i<=n;++i)cin>>p[i];
p[n+1]=l;
for(int i=1;i<=n+1;++i)Time[i]=INF;
for(int i=1;i<=n+1;++i){
for(int j=0;j<i;++j){//通过第j个充电站到达第i个充电站
double s=p[i]-p[j];
double T=s>c ? c/vt1+(s-c)/vt2 : s/vt1;
if(j)T+=t;
Time[i]=min(Time[i],Time[j]+T);
}
}
if(Time[n+1]<=l/vr)cout<<"What a pity rabbit!"<<endl;
else cout<<"Good job,rabbit!"<<endl;
}
}
以下是我的另一种想法:从第i个充电站到达第i+1个充电站每次选择在第i个充电站充电与不充电所要花的最少时间
不过提交是错的,跪求路过的大神帮忙给一个错误数据吧,我找了好久都没找到
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 99999999
using namespace std;
const int MAX=102;
double p[MAX];
int main(){
int n;
double c,t,vr,vt1,vt2,l;
while(cin>>l){
cin>>n>>c>>t>>vr>>vt1>>vt2;
for(int i=0;i<n;++i)cin>>p[i];
p[n]=l;
double time=p[0]/vt1,way=c-p[0];
if(way<0)time=(p[0]-c)/vt2+c/vt1,way=0;
for(int i=0;i<n;++i){
double s=p[i+1]-p[i];
if(t+min(s,c)/vt1+max(0.0,s-c)/vt2<=min(s,way)/vt1+max(0.0,s-way)/vt2){
time+=t+min(s,c)/vt1+max(0.0,s-c)/vt2;
way=max(0.0,c-s);
}
else{
time+=min(s,way)/vt1+max(0.0,s-way)/vt2;
way=max(0.0,way-s);
}
}
if(time>l/vr)cout<<"Good job,rabbit!"<<endl;
else cout<<"What a pity rabbit!"<<endl;
}
return 0;
}