P3382|三分法模板

三分法求极值

其实就是每次取左右边界的中点,(然后中点稍微左偏一点、再中点往右偏一点,相等于缩小了区间)
再然后
如果求极大值:如果左边界函数值 <= 右边界函数值(说明还没到极值点),R = mid;否则L = mid;
如果求极小值:如果左边界函数值 >= 右边界函数值(说明还没到极值点),L = mid;否则R = mid;

#include<bits/stdc++.h>
using namespace std;

const double eps=1e-6;
int n;
double L,R;
double a[15];

double check(double x){
    double sum = 0;
    //1层循环:求多项式的值 从幂最大(从左往右)求多项式每次累乘1个x  
    for(int i=n;i>=0;i--) sum = sum*x+a[i];
    return sum;
} 

int main(){
    cin>>n>>L>>R;
    for(int i=n;i>=0;i--) cin>>a[i];
    while(L + eps < R){
        double mid = (L+R)/2;
        if(check(mid+eps) <= check(mid-eps))
            R = mid;
        else
            L = mid;
    }
    printf("%.5lf",R);
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/fisherss/p/12308587.html