【模板】单峰函数求极值

这里采用的是求导+二分的做法。其中用到了多项式的单点求值算法,即:秦九韶算法,对于一个 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;
}
原文地址:https://www.cnblogs.com/wzj-xhjbk/p/11527344.html