其实就是二分法的拓展,一般为求一个(一边递增,一边递减的区间)的最值。也可以用二分+导数做
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
double l,r,ex=1e-7;
double xi[15];
//秦九韶多项式计算
double getV(double x)
{
double ans=0;
for(int i=1;i<=n+1;i++){
ans=ans*x+xi[i];
}
return ans;
}
int main()
{
cin>>n>>l>>r;
for(int i=1;i<=n+1;i++)
cin>>xi[i];
double mid=(l+r)/2.0;
while(abs(r-l)>ex)
{
//可以写为(2*l+r)/3和(l+2*r)/3,即[l,r]的三分点位置,在mid左右
if(getV(mid-ex)>getV(mid+ex)){
r=mid;
}else{
l=mid;
}
mid=(l+r)/2.0;
}
printf("%.5lf",mid);
return 0;
}