#include <iomanip>
#include <iostream>
#include <algorithm>
// 数据类型简化
#define L unsigned long long
#define LL long long
#define I unsigned int
// cin/cout 优化
#define endl '\n'
// sort + unique
#define soun(nf, nl, m) sort(nf, nl); m = unique(nf, nl) - (nf)
// for 循环简化
#define ref(i, a, b, p) for (signed(i) = (a); (i) <= signed(b); (i) += signed(p))
#define gef(i, a, b, p) for (signed(i) = (a); (i) >= signed(b); (i) -= signed(p))
using namespace std;
double d1, c, d2, p1, n, ans;
struct station
{
double d = 0, p = 0;
} s[10];
void work()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> d1 >> c >> d2 >> p1 >> n;
s[0].d = 0, s[0].p = p1;
s[int(n) + 1].d = d1, s[int(n) + 1].p = 0;
ref (i, 1, n, 1)
cin >> s[i].d >> s[i].p;
double sum = 0;
const double ch = c * d2;
ref (i, 0, n, 0)
{
if (s[i + 1].d - s[i].d > ch)
{
cout << "No Solution" << endl;
return;
}
int cnt = i + 1;
while (cnt <= n)
if (s[cnt].d - s[i].d > ch)
break;
else
cnt++;
// (cnt > n) ? cnt = n : cnt = cnt;
int r = i + 1, p = 0;
while (r <= cnt)
{
if (s[r].p < s[i].p)
{
p = r;
break;
}
r ++;
}
if (p != 0)
{
sum = s[i].p * (s[p].d - s[i].d) / d2 - sum;
ans += sum;
i = p;
sum = 0;
continue;
}
r = i + 1, p = __INT_MAX__;
int t = 0;
while (r <= cnt)
{
if (s[r].p < p)
p = s[r].p, t = r;
r ++;
}
sum = s[i].p * c;
ans += sum;
sum -= s[i].p * (s[p].d - s[i].d) / d2;
i = t;
}
cout << fixed << setprecision(2) << ans << endl;
return ;
}
int main()
{
work();
return 0;
}
贪心,第五个点错了。
输入:
475.6 11.9 27.4 14.98 6
102.0 9.99
220.0 13.29
256.3 14.79
275.0 10.29
277.6 11.29
381.8 10.09
输出:
192.15
我的输出:
191.98