#include <cstdio>
#include <algorithm>
using namespace std;
struct Node
{
double price,dis;
}node[510];
//将加油站按离起点的距离排序
bool cmp(const Node &a,const Node &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",&node[i].price,&node[i].dis);
sort(node,node+n,cmp);
//最后假设终点为一个距离为d的加油站
node[n].dis=d,node[n].price=0;
//特判,起点没有加油站
if(node[0].dis!=0)
{
printf("The maximum travel distance = 0.00\n");
return 0;
}
//now表示当前所在加油站,ans表示花费,nowtank表示当前油箱油量,MAX表示加满油能跑的最远距离
int now=0;
double ans=0,nowtank=0,MAX=cmax*davg;
while(now<n)
{
int k=-1;
double minprice=99999999;
//在加满油能到达的下一个加油站中选取油价最低的加油站
for(int i=now+1;i<=n&&node[i].dis-node[now].dis<=MAX;i++)
{
if(node[i].price<minprice)
{
minprice=node[i].price;
k=i;
//有加油站比当前加油站油价更低,跳出
if(minprice<node[now].price)
break;
}
}
//加满油的情况下不能到达任何一个加油站
if(k==-1)
break;
double need=(node[k].dis-node[now].dis)/davg;
//下一个加油站油价比当前加油站低
if(minprice<node[now].price)
{
//当前油箱油量不足以到达下一个加油站,加油至刚好能到达下一个加油站
if(nowtank<need)
{
ans+=(need-nowtank)*node[now].price;
nowtank=0;
}
//当前油箱油量足够,减去所需油量
else
nowtank-=need;
}
//下一个加油站油价大于等于当前加油站油价,在当前加油站将油箱加满
else
{
ans+=(cmax-nowtank)*node[now].price;
nowtank=cmax-need;
}
now=k;
}
//到达终点
if(now==n)
printf("%.2f\n",ans);
//不能到达终点
else
printf("The maximum travel distance = %.2f\n",node[now].dis+MAX);
return 0;
}
PAT1033 To Fill or Not to Fill (25 分)
最新推荐文章于 2024-03-22 06:13:25 发布