三分算法——洛谷模板P3382

类似于二分查找,三分搜索法也是比较常用的基于分治思想的高效查找方法。但是和二分不同,二分只适用于单调函数,三分用于单峰函数。

其原理就是利用两个中间点,逐渐逼近峰值。

 

midl和midr的值谁更大,就变动那边的边界,想中心极值点逼近。

洛谷模板3382。

#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

double a[20];
int n;

double f(double x)
{
    int i;
    double result = 0;
    double cf = 1;
    for (i = 0; i <= n; i++)
    {
        result = result + cf * a[i];
        cf = cf * x;
    } 
    return result;
} 

int main(int argc, char** argv)
{
    double midl, midr;
    double l, r;
    int i;
    cin >> n >> l >> r;
    for (i = n; i >= 0; i--)
        cin >> a[i];
    while (abs(r - l) > 1e-6)
    {
        midl = (l + r) / 2;
        midr = (midl + r) / 2;
        if (f(midl) < f(midr))
            l = midl;
        else
            r = midr;
    } 
    cout << fixed << setprecision(5) << l << endl;
	return 0;
}

  

 

posted @ 2020-02-22 15:07  土地  阅读(63)  评论(0)    收藏  举报