我們知道二分一般用於單調區間,而遇到凸性函數時,三分就能派上很大的用場,
luogu3382
分析
本題保證了一定有解,而且保證了是凸性函數(不是凹性)
所以三分
【l,r】
【l,(l+r)/3】,【l+(l+r)/3*2,r】
每次去掉1/3的區間
時間O(2*logn)
黃金分O(logn)
核心程序
#define M 0.0000001
while(r-l>M){
p=l+(r-l)/3;
q=l+(r-l)/3*2;
if(Cal(p)>Cal(q))r=q;
else l=p;
}
完整AC程序
#include<cstdio>
#include<iostream>
#include<cmath>
#define N 20
#define M 0.0000001
using namespace std;
double l,r,p,q,a[N];
int n;
double Cal(double x){
double ans=0;
for(int i=0;i<=n;i++){
ans=ans*x+a[i];
}
return ans;
}
int main(){
freopen("data.txt","r",stdin);
// freopen("1.txt","w",stdout);
scanf("%d%lf%lf",&n,&l,&r);
for(int i=0;i<=n;i++)scanf("%lf",&a[i]);
while(r-l>M){
p=l+(r-l)/3;
q=l+(r-l)/3*2;
if(Cal(p)>Cal(q))r=q;
else l=p;
}
printf("%.5f\n",l);
}