#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 510
#define INF 30010
struct station{
double price,dis;
}st[maxn];
bool cmp(station a,station b)
{
return a.dis<b.dis;
}
int main()
{
int n;
double Cmax,D,Davg;
scanf("%lf%lf%lf%d",&Cmax,&D,&Davg,&n);
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&st[i].price,&st[i].dis);
}
st[n].price=0;
st[n].dis=D;
sort(st,st+n,cmp);
if(st[0].dis!=0)
{
printf("The maximum travel distance = 0.00\n");
}
else
{
int now=0;
double ans=0,nowTank=0,MAX=Cmax*Davg;
while(now<n)
{
int k=-1;
double priceMin=INF;
for(int i=now+1;i<=n&&st[i].dis-st[now].dis<=MAX;i++)
{
if(st[i].price<priceMin)
{
priceMin=st[i].price;
k=i;
if(priceMin<st[now].price)
{
break;
}
}
}
if(k==-1)
break;
double need=(st[k].dis-st[now].dis)/Davg;
if(priceMin<st[now].price)
{
if(nowTank<need)
{
ans+=(need-nowTank)*st[now].price;
nowTank=0;
}
else
{
nowTank-=need;
}
}
else
{
ans+=(Cmax-nowTank)*st[now].price;
nowTank=Cmax-need;
}
now=k;
}
if(now==n)
printf("%.2f\n",ans);
else
printf("The maximum travel distance = %.2f\n",st[now].dis+MAX);
}
return 0;
}
复杂的局部贪心
首先得找出到不了目的地的情况
一是不能出发
还有就是最多的储存油不能支持到终点(这是最大距离就是max+距离)
先给距离排序
选出最小或较小价格加油站(决定是加满油还是只加支持到下一个加油站的油)