分析:
详见代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 500 + 5;
struct node
{
double s; //离出发点的距离
double p; //油站的油价
}mp[N];
int main()
{
double ed, c, d2, p;
int n;
cin >> ed >> c >> d2 >> p >> n;
for (int i = 1;i <= n;i++)
cin >> mp[i].s >> mp[i].p;
//加上起点,终点
mp[0] = { 0,p };mp[n+1] = { ed,0 };
//查看是否会有无法到达的情况
double x = c * d2; //x表示车最多能跑多久
for (int i = 0;i <= n;i++)
{
if (mp[i + 1].s - mp[i].s > x)
{
cout << "No Solution";
return 0;
}
}
//开始模拟
double d = 0; //d表示当前离起点的距离
double now_o = 0; //当前油箱油量
int i = 0, j = 0;
double res = 0; //存储费用
while (d < ed)
{
int j = i;
//找到第一个油价比当前油站小的油站
while (j <= n && mp[j].p >= mp[i].p)
j++;
//看看能不能直接过去
if (x >= mp[j].s - mp[i].s) //能够直接过去
{
double ss = mp[j].s - mp[i].s; //两个油站的距离
if (now_o * d2 >= ss) //能够直接到达
now_o -= ss / d2; //减去要消耗的油量
else //能直接到达,油量不够,加油
{
double add = ss / d2-now_o;
res += add * mp[i].p;
now_o =0;
}
i = j; //直接过去了
}
else //不能直接到达
{
//把油给加满
double add = (c - now_o);
res += add * mp[i].p;
now_o = c;
//开去下一个油站
now_o -= (mp[i + 1].s - mp[i].s) / d2;
i++; //开到下一站了
}
d = mp[i].s;
}
printf("%.2lf", res);
}