这道题用贪心的思想。分两种情况讨论。到一个加油站时需要考虑以下情况。
1.在未来可到达的加油站中,有更便宜的价格。则只需要加到能行驶到最便宜的加油站的油后在加油
2.在未来可到达的加油站中,没有比当前便宜的价格,则在当前站将油加满,行驶到最便宜的加油站去考虑下一步怎么做。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int c_max,d,distance_avg,total;
struct gas{
double price,d;
bool operator<(const gas& a) const{ //重载运算符,按照距离从小到大排序
return d<a.d;
}
}gas[510];
int main(){
cin>>c_max>>d>>distance_avg>>total;
for(int i=0;i<total;i++){
cin>>gas[i].price>>gas[i].d;
}
gas[total]={0,(double)d};
sort(gas,gas+total+1);
if(gas[0].d){ //如果出发点没有加油站,则无法到达。因为tank初始为空
printf("The maximum travel distance = 0.00");
return 0;
}
double sum=0,oil=0;
for(int i=0;i<total;){
int k=-1;
for(int j=i+1;j<=total&&gas[j].d-gas[i].d<=c_max*distance_avg;j++){//遍历可到达的加油站寻找是否有更便宜的
if(gas[j].price<gas[i].price){//有更便宜的
k=j;
break;
}
else if(k==-1||gas[j].price<gas[k].price)//没有比当前加油站更便宜的,则选择该路段最小的
k=j;
}
if(k==-1){//在油耗尽无法到达下一个加油站
printf("The maximum travel distance = %.2lf\n",gas[i].d+c_max*distance_avg);
return 0;
}
else if(gas[k].price<=gas[i].price){//有更便宜的,则行驶到便宜的加油站加油
sum+=((gas[k].d-gas[i].d)/distance_avg-oil)*gas[i].price;//行驶到便宜的加油站需要的油费,即总共所需要的油减去油箱还有的油 * 油费
i=k;
oil=0;//行驶到加油站,油耗尽
}
else{//没有更便宜的,油加满
sum+=(c_max-oil)*gas[i].price; //油加慢的费用
oil=c_max-(gas[k].d-gas[i].d)/distance_avg;//行驶到该加油站所消耗的油
i=k;
}
}
printf("%.2lf\n",sum);
return 0;
}