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;
} 
posted @ 2020-02-14 19:06  fishers  阅读(148)  评论(0编辑  收藏  举报