三分法

来源:互联网 发布:mac os官方下载 编辑:程序博客网 时间:2024/05/18 09:21

我们知道二分一般用于单调区间,而遇到凸性函数时,三分就能派上很大的用场,
luogu3382

分析

本题保证了一定有解,而且保证了是凸性函数(不是凹性)
所以三分
【l,r】
【l,(l+r)/3】,【l+(l+r)/3*2,r】
每次去掉1/3的区间
时间O(2*logn)
黄金分O(logn)

核心程序

#define M 0.0000001while(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.0000001using 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);}
原创粉丝点击