#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
const int N = 1e1 + 10;
int n = 0;
// 给定两个城市之间的距离 D1
// 汽车油箱的容量 C(以升为单位)
// 每升汽油能行驶的距离 D2
// 出发点每升汽油价格P和沿途油站数 N(N 可以为零)
double d1 = 0,c = 0,d2 = 0;
double p = 0,maxx = 0,rem = 0;
struct Node
{
double d;
double p;
}nums[N];
int cmp(Node a,Node b)
{
return a.d < b.d;
}
double fun()
{
double rdis = 0,res = 0;
int now = 0,tp = -1,midx = 0;
Node minn;
minn.p = 1e3 + 10;
//按照距离大小排序
sort(nums,nums + n + 2,cmp);
while(rdis != d1)
{
// 先判断有没有比当前加油站便宜的加油站
// 如果没有,看可不可以直接到终点
// 或者有没有相对便宜的加油站
for(int i = now + 1;i <= n + 1 && (nums[i].d - nums[now].d) <= maxx;i++)
{
//找比当前加油站便宜的加油站
if(nums[i].p < nums[now].p)
{
tp = i;
break;
}
//找相对便宜的
if(minn.p > nums[i].p)
{
minn.p = nums[i].p;
minn.d = nums[i].d;
midx = i;
}
}
//没有比这个当前加油站便宜的加油站
if(tp == now)
{
//可以直接到终点
if((nums[n + 1].d - nums[now].d - rem) <= maxx)
{
tp = n + 1;
}
//无法直接到终点,到相对便宜的
else
{
tp = midx;
//加满到相对便宜的加油站
rem += (maxx - (nums[tp].d - nums[now].d - rem * d2)) / d2;
}
}
rdis = nums[tp].d;
if(rdis - nums[now].d <= rem * d2)
{
rem = 0;
now = tp;
continue;
}
res += (rdis - nums[now].d - rem * d2) / d2 * nums[now].p;
rem = 0;
now = tp;
}
return res;
}
int main()
{
double res = 0,flg = 0;
cin >> d1 >> c >> d2 >> p >> n;
maxx = c * d2;
nums[0].d = 0;
nums[0].p = p;
for(int i = 1;i <= n;i++)
{
cin >> nums[i].d;
cin >> nums[i].p;
if((nums[i].d - nums[i - 1].d) > maxx)
{
flg = 1;
}
}
if(d1 - nums[n].d > maxx)
{
flg = 1;
}
//在输入时就判断可不可以到达下一个加油站
//不用在处理的时候判断,更快
if(flg == 1)
{
cout << "No Solution" << endl;
return 0;
}
nums[n + 1].d = d1;
nums[n + 1].p = 0;
res = fun();
//保留小数点后两位
cout << fixed << setprecision(2) << res << endl;
return 0;
}
一个特别丑陋的代码,玄关