这里采用的是求导+二分的做法。其中用到了多项式的单点求值算法,即:秦九韶算法,对于一个 N 次多项式的单点求值,只需要做 N 次乘法和 N 次加法即可求出在某点处的值。
代码如下
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cout << fixed << setprecision(5);
int n;
double l, r;
cin >> n >> l >> r;
vector<double> a(n + 1);
for (int i = 0; i <= n; i++) {
cin >> a[n - i];
}
auto calc = [&](double x) {
double ret = a[n];
for (int i = n - 1; i >= 0; i--) {
ret = ret * x + a[i];
}
return ret;
};
auto div = [&](double x) {
double dx = 1e-8;
double dy = calc(x + dx) - calc(x);
return dy / dx;
};
while (r - l > eps) {
double mid = (l + r) / 2.0;
if (div(mid) >= 0) {
l = mid;
} else {
r = mid;
}
}
cout << l << endl;
return 0;
}