三分适用于求单峰函数的极值。
定理 设 为[a,b]上的单峰函数, 是它的峰值点,设 , ( < )是[a,b]上任意两点,那么,
若 ,则 在 上;
若 ,则 在 上。
与二分的区别:二分适用于单调函数,而三分则适用于单峰函数。
复杂度:logn
ps:在很多题目中单峰函数是需要发现(转化)的。
code:
#include<iostream>
#include<cstdio>
using namespace std;
const int N=20;
const double EPS=1e-7;//这里一般将规定精度后移两个小数点即可
int n;
double l, r, a[N];
double pow(double x, int p) {
double tmp=1;
while (p--)
tmp*=x;
return tmp;
}
double f(double x) {
double tmp=0;
for (int i=n; i>=0; i--)
tmp+=a[i]*pow(x, i);
return tmp;
}
int main() {
cin >> n >> l >> r;
for (int i=n; i>=0; i--)
cin >>a[i];
while (r-l>=EPS) {
double tmpl=l+(r-l)/3, tmpr=r-(r-l)/3;
if (f(tmpl)<f(tmpr)) l=tmpl;
else r=tmpr;