以 洛谷P3382 【模板】三分法 为例
如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减。试求出x的值。
函数求导转化为二分
求二分函数的零点
裸三分
若calcu(mid1) > calcu(mid2) 则答案(l, mid2)区间里 否则在(mid1, r)
//P3382 【模板】三分法
#include <bits/stdc++.h>
using namespace std;
int n;
double l, r, a[15];
double calcu(double x){ //秦九韶算法计算多项式的值
double ans = a[0];
for(register int i = 1; i <= n; ++i) ans = ans * x + a[i];
return ans;
}
void f(double l, double r){ //三分法求凸函数最值
if (r - l <= 1e-6) {printf("%.5lf", l); return;}
double mid1 = (r - l) / 3 + l, mid2 = (r - l) / 3 * 2 + l;
if (calcu(mid1) > calcu(mid2)) f(l, mid2);
else f(mid1, r);
}
int main(){
scanf("%d%lf%lf", &n, &l, &r);
for (register int i = 0; i <= n; ++i) scanf("%lf", &a[i]);
f(l, r);
return 0;
}
注意此处可以利用秦九韶算法计算多项式的值 时间复杂度为O(n) 否则要O(n^2)
优选法(黄金分割法)求函数极值
还没看呢。。。