zoukankan      html  css  js  c++  java
  • 【模板】单峰函数求极值

    这里采用的是求导+二分的做法。其中用到了多项式的单点求值算法,即:秦九韶算法,对于一个 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;
    }
    
  • 相关阅读:
    uva 11549
    uva 11078
    uva 1335
    uva 1267
    uva 11520
    uva 12124
    uva 10795 A Different Task
    ACM俱乐部算法基础练习赛(1)
    【BZOJ1010】玩具装箱
    【BZOJ1901】Dynamic Rankings
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/11527344.html
Copyright © 2011-2022 走看看