三分法

我們知道二分一般用於單調區間,而遇到凸性函數時,三分就能派上很大的用場,
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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章