『学习笔记』三分

用来求单峰函数的极值点。

字面意思,把区间分成三份,每次根据切割点的关系选择丢弃左边或右边区间。每次操作可以使区间长度 \(\text{len} \larr \text{len} \times \dfrac{2}{3}\)

考虑优化,既然是丢弃左右区间,那就可以使左右区间尽可能大,尝试使时间复杂度接近 \(O(\log n)\)

板子代码:

#include <iostream>
#include <cmath>
using namespace std;
const double eps=1e-7,c=1e-5;
int n;
double l,r,lmid,rmid;
int a[22];

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

// 求x\in[l,r]中最大值
int main(){
    scanf("%d%lf%lf",&n,&l,&r); n++;
    for(int i=1; i<=n; i++) scanf("%d",&a[i]);
    while(fabs(l-r)>=eps){
        double mid=(l+r)/2;
        lmid=mid-c,rmid=mid+c;
        if(calc(lmid)<calc(rmid)) l=mid;
        else r=mid;
    }
    printf("%.5lf\n",l);
    return 0;
}
posted @ 2025-01-05 22:11  仙山有茗  阅读(3)  评论(0)    收藏  举报