题目:
样例:
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
struct station{
double P;//每个加油站每单位油价格
double D;//每个加油站到杭州的距离
}st[510];
bool cmp(station a,station b){
return a.D<b.D;
}
int main(){
double cmax;//最多油量
double d;//总路程
double davg;//每单位油所走路程
int n;//加油站数量
while(scanf("%lf%lf%lf%d",&cmax,&d,&davg,&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%lf%lf",&st[i].P,&st[i].D);
}
st[n].D=d;
st[n].P=0;//把终点处看做是一个距离杭州距离为d且价格为0的站点
sort(st,st+n,cmp);//将加油站按照距离杭州的远近从大到小排序
if(st[0].D!=0){//起点根本就没有加油站,汽车无法启动
printf("The maximum travel distance = 0.00\n");
break;
}
int now=0;//当前所在站点
double price=0;//总花费
double tank=0;//当前油量
double range=cmax*davg;//续航里程
while(now<n){
double min=100000000;
int k=-1;
for(int i=now+1;i<=n&&st[i].D-st[now].D<=range;i++){//在续航里程里找比当前油箱里的油更便宜的油
if(st[i].P<min){
min=st[i].P;
k=i; //如果一直没有找到比当前价格更低的,直接K最后等于n
if(st[now].P>min){//找到比当前价格更低的,退出循环
break;
}
}
}
if(k==-1){//k=-1说明连上一个for循环都没进去,说明两个之间距离大于能行驶的距离了
break;
}
double need=(st[k].D-st[now].D)/davg;//直达下个目的地所需要的油量
if(st[now].P>min){//找到价格更低的,直接直达
if(tank<need){//如果油不够在当前站补满需要的油
price+=(need-tank)*st[now].P;
tank=0;
}
else if(tank>=need){//油够的话直接扣
tank=need-tank;
}
}
else{//没有在里程里找到价格更低的,先在当前站加满油
price+=(cmax-tank)*st[now].P;
tank=cmax-need;
}
now=k;
}
if(now==n){
printf("%.2f\n",price);
}
else{
printf("The maximum travel distance = %.2f\n",st[now].D+range);
}
}
return 0;
}