本题主要是很复杂,自己找到思路,但是写起来到最后还是会卡壳,现在把思路大概顺一下,本题参考了晴神的写法。
首先选择加油站时要根据距离杭州的远近排序,注意,当第一个加油站距离是非0的话,那么起步就不行了,这里是一个判断,起步完成之后,我们可以比较下一站,如果在每次满油能走过的路程中找到比当前价格便宜的,那么应该先加至少能够到达此处的油,如果没有找到比当前价格便宜的,那么应该找这其中最便宜的,先加满油到达此处,如果没有找到,那么说明不能到达,返回当前距离加上满油的行驶距离
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=501;
const int inf=100000000;
struct node
{
double price;
double dis;
}a[maxn];
bool cmp(node b,node c){
return b.dis<c.dis;
}
int main()
{
double cmax,d,davg;
int n;
cin>>cmax>>d>>davg>>n;
for (int i=0;i<n;i++)
{
scanf("%lf %lf",&a[i].price,&a[i].dis);
}
a[n].dis=d;
a[n].price=0;
sort (a,a+n,cmp);
if (a[0].dis>0)
printf("The maximum travel distance = 0.00");
else
{
int now=0;
double ans=0,nowtank=0,max=davg*cmax;
while (now<n)
{
int k=-1;
double minprice=inf;
for (int i=now+1;i<=n&&(a[i].dis-a[now].dis<=max);i++)
{
if (a[i].price<minprice)
{
minprice=a[i].price;
k=i;
if (a[i].price<a[now].price)
break;
}
}
if (k==-1)break;
double need=(a[k].dis-a[now].dis)/davg;
if (minprice>=a[now].price)
{
ans+=(cmax-nowtank)*a[now].price;
nowtank=cmax-need;
}
else
{
if (nowtank>=need)
nowtank-=need;
else
{
ans+=(need-nowtank)*a[now].price;
nowtank=0;
}
}
now=k;
}
if (now==n)
printf("%.2f",ans);
else
printf("The maximum travel distance = %.2f",a[now].dis+max);
}
}