这题其实我不怎么会,看了柳神的代码和思路分析
思路:
①首先,把终点看成是距离为dis,油价为0的一个加油站,这样问题就变成如何到达最后一个加油站
②然后,要考虑每一站怎么选择是否加油以及加油量
1)如果从当前的加油站到最远可以到达的距离之间,存在比当前油站的油价更低的加油站,则只需要把油加到能开到下个加油站即可
2)如果不存在,则需要把当前的邮箱加满,并且找到后面能到达加油站中,油价最便宜的,然后再加油
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
double price,dis;
}p[505];
bool cmp(node a,node b){
return a.dis<b.dis;
}
int main()
{
double c,d,da;
int n;
cin>>c>>d>>da>>n;
for(int i=0;i<n;i++)
cin>>p[i].price>>p[i].dis;
p[n].price=0.0,p[n].dis=d;
sort(p,p+n+1,cmp);
int cur=0;
double curdis=0,maxdis=0,curprice=0,cost=0,leftdis=0;//leftdis 指油箱的油还能跑多远
if(p[0].dis!=0){
cout<<"The maximum travel distance = 0.00"<<endl;
return 0;
}
else
curprice=p[0].price;
while(curdis<d){
maxdis=curdis+c*da;
double minpricedis=0,minprice=100000;
int flag=0,u=-1;
for(int i=cur+1;i<=n;i++){
if(p[i].dis<=maxdis&&p[i].price<curprice){
cost+=(p[i].dis-curdis-leftdis)*curprice/da;
leftdis=0;
curdis=p[i].dis;
curprice=p[i].price;
flag=1;
cur=i;
break;
}
if(p[i].dis<=maxdis&&p[i].price<minprice){
minprice=p[i].price;
minpricedis=p[i].dis;
u=i;
}
}
if(flag==0&&minprice!=100000){
cost+=curprice*(c-leftdis/da);
leftdis=c*da-(minpricedis-curdis);
curdis=minpricedis;
curprice=minprice;
cur=u;
}
if(flag==0&&minprice==100000){
curdis+=c*da;
printf("The maximum travel distance = %.2lf",curdis);
return 0;
}
}
printf("%.2lf",cost);
return 0;
}