『学习笔记』三分
用来求单峰函数的极值点。
字面意思,把区间分成三份,每次根据切割点的关系选择丢弃左边或右边区间。每次操作可以使区间长度 \(\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;
}