第四个测试样例,答案是192.15,跑出来是191.98
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
double D, C, d;
int n;
double dd[N], pp[N];
int main()
{
cin >> D >> C >> d >> pp[0] >> n;
dd[0] = 0; // 起点相当于第0个加油站
dd[n + 1] = D, pp[n + 1] = 999; // 终点相当于为第n+1个加油站
for (int i = 1; i <= n; i++)
{
cin >> dd[i] >> pp[i];
}
for (int i = 0; i <= n; i++)
{
if ((dd[i + 1] - dd[i]) > C * d) // 两个加油站的距离过大,无解
{
cout << "No Solution";
return 0;
}
}
int i = 0; // 当前到达哪个加油站
double c_now = 0; // 当前的油量
double p_now = 0; // 当前花的钱
while (i != n + 1)
{
int j, move_i;
for (move_i = i + 1; move_i <= n+1; move_i++) // 加满油能到达的最远的加油站(或终点,此时为n+1)
{
if(move_i == n+1) break;
if (dd[move_i] - dd[i] > C * d)
{
move_i--;
break;
}
}
for (j = i + 1; j <= n+1; j++) // 找到比当前油价更低的加油站j(或终点,此时为n+1)
{
if(j == n+1) break;
if (pp[j] < pp[i])
break;
}
if (j > move_i) // 无法到达,加满油,走到路程中油价最低的加油站
{
int o;
double min_p = 999.0; // 找到move_i与i之间最少油价的加油站
for (int k = i + 1; k <= move_i; k++)
{
if (pp[k] < min_p)
{
o = k;
}
}
p_now += (double)(C - c_now) * pp[i];
c_now = (double)(C - (dd[o] - dd[i]) / d);
i = o;
}
else // 能到达,让油刚好够
{
if ((dd[j] - dd[i]) / d >= c_now)
{
p_now += (double)((dd[j] - dd[i]) / d - c_now) * pp[i];
c_now = 0.0;
}
else
{
c_now -= (double)(dd[j] - dd[i]) / d;
}
i = j;
}
}
cout << fixed << setprecision(2) << p_now;
return 0;
}