换了一个贪心策略WA1,3,4,写了注释
#include<iostream>
using namespace std;
double d1,c,d2,a,max_d,ans=0;//a:剩余油量,max_d:最远距离,其他与题目中一致
double p[10],d[10];/*d:每个油站距离 p:每个油站油价*/
int n;
void move(int now){
if(now==n){//到达
printf("%.2lf",ans);
return;
}
int nxt=-1,max_x=-1;
for(int i=now+1;i<=n;i++){//找下一个比当前油价低的油站
if(p[i]<p[now]){
nxt=i;
break;
}
}
if(nxt!=-1){//找到了
ans+=((d[nxt]-d[now])/d2-a)*p[now];//加到刚好能到
a=0;
//cout<<nxt<<endl;
move(nxt);
}else{//没找到
int minn=600,minx=-1;
for(int i=now+1;i<=n;i++){//找后面能到达的最便宜油站
if(d[i]-d[now]>max_d){
break;
}
if(p[i]<minn){
minn=p[i];
minx=i;
}
}
if(minx=-1){//没有可以到达的油站
cout<<"No Solution";
return;
}
ans+=(c-a)*p[now];//加满油
a=(d[max_x]-d[now])/d2;//计算剩余油量
//cout<<max_x<<endl;
move(max_x);
}
}
int main(){
cin>>d1>>c>>d2>>p[0]>>n;//0号油站为起点
d[0]=0;
for(int i=1;i<=n;i++){
cin>>d[i]>>p[i];
}
max_d=c*d2;//计算最远距离
for(int i=0;i<=n;i++){//手写冒泡(没用结构体)
for(int j=i;j<=n;j++){
if(d[j]<d[i]){
swap(d[j],d[i]);
swap(p[j],p[i]);
}
}
}
move(0);
return 0;
}