坑点
(1)必须存在一个距离为0的加油站,否则哪也去不了
测试点4就是过不了,以后再回头看吧,,,
#include<bits/stdc++.h>
using namespace std;
struct Sta{
double price;
double dis;
}sta[501];
double cap,d,avg;
int n;
bool cmp(Sta a,Sta b)
{
return a.dis!=b.dis?a.dis<b.dis:a.price<b.price;
}
int search(int k)
{
int j=-1;
double Min=10000000*1.0;
for(int i=k+1;i<n;i++)
{
if((sta[i].dis-sta[k].dis)>cap*avg||sta[i].dis>=d) break;
if(sta[i].price<sta[k].price)
{
j=i;break;
}
else{
if(sta[i].price<Min)
{
j=i;Min=sta[i].price;
}
}
}
return j;
}
int main()
{
scanf("%lf%lf%lf%d",&cap,&d,&avg,&n);
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&sta[i].price,&sta[i].dis);
}
sort(sta,sta+n,cmp);
double sum=0.0,tank=0.0;
if(sta[0].dis!=0.0) printf("The maximum travel distance = 0.00");
else{
int i=0;
while(1)
{
int j=search(i);
if(j==-1){
if(sta[i].dis+cap*avg>=d)
{
sum+=((d-sta[i].dis)/avg-tank)*sta[i].price;
printf("%.2f",sum);
break;
}
else{
printf("The maximum travel distance = %.2f",sta[i].dis+cap*avg);break;
}
}
double temp=(sta[j].dis-sta[i].dis)/avg;
if(sta[j].price<sta[i].price)
{
sum+=(temp-tank)*sta[i].price;
tank=0;
}else{
sum+=sta[i].price*(cap-tank);
tank=cap-temp;
}
i=j;
}
}
return 0;
}