策略
1.优先前往更低油价的加油站。
2.在没有更低油价的加油站时,前往油价尽可能低的加油站。
3.没有加油站可以到达时,结束算法。
代码
#include<bits/stdc++.h>
using namespace std;
struct Station
{
double price = 0.0;
double dis = 0.0;
}s[510];
bool cmp(Station s1, Station s2)
{
return s1.dis < s2.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", &s[i].price, &s[i].dis);
s[n].dis = D;//最后一个加油站存目的距离
sort(s, s + n, cmp);
if (s[0].dis != 0)//第一个加油站距离不为0则无法前进
printf("The maximum travel distance = 0.00");
else
{
int now = 0;
double ans = 0.0, nowTank = 0.0, MAX = Cmax * Davg;
while(now < n)
{
int k = -1;
double priceMin = 1000000000;
for(int i = now + 1; i <= n && s[i].dis - s[now].dis <= MAX; i++)
{
if (s[i].price < priceMin)
{
priceMin = s[i].price;//更新最低油价
k = i;
if (priceMin < s[now].price)
break;
}
}
if (k == -1)//满油找不到加油站
break;
double need = (s[k].dis - s[now].dis) / Davg;
if (priceMin < s[now].price)
{
if (nowTank < need)
{
ans += (need - nowTank) * s[now].price;
nowTank = 0;
}
else
nowTank -= need;
}
else
{
ans += (Cmax - nowTank) * s[now].price;
nowTank = Cmax - need;
}
now = k;
}
if (now == n)
printf("%.2f", ans);
else
printf("The maximum travel distance = %.2f", s[now].dis + MAX);
}
return 0;
}