洛谷 P3382 【模板】三分法

https://www.luogu.org/problemnew/show/3382

(dcmp是个好东西)

先增后减求极大。

如果f(lm)大于f(rm),那么答案在[l,rm]之间

否则答案在[lm,r]之间

(在这里,等于无所谓)

如果先减后增求极小,则大于和小于交换。(如果忘了,画张函数图像,举些特例就知道了)

曾经错误:见注释掉的代码

#include<cstdio>
#include<cmath>
using namespace std;
const double eps=1e-8;
int dcmp(double x)
{
    if(fabs(x)<eps)    return 0;
    return x<0?-1:1;
}
int n;
double a[20],l,r;
double getans(double x)
{
    double b=1,ans=a[n+1];
    for(int i=1;i<=n;i++)
    {
        b*=x;
        ans+=b*a[n-i+1];
    }
    return ans;
}
int main()
{
    int i;
    double lm,rm,d1,d2;
    scanf("%d%lf%lf",&n,&l,&r);
    for(i=1;i<=n+1;i++)
        scanf("%lf",&a[i]);
    while(dcmp(r-l)>0)
    {
        lm=l+(r-l)/3;
        rm=r-(r-l)/3;//rm=lm+(r-l)/3;
        d1=getans(lm);
        d2=getans(rm);
        if(d1>d2)
            r=rm;//r=d2;
        else
            l=lm;//l=d1;
    }
    printf("%.5lf",(l+r)/2);
    return 0;
}
posted @ 2017-11-07 21:43  hehe_54321  阅读(204)  评论(0编辑  收藏  举报
AmazingCounters.com