洛谷 P3382 【模板】三分法

原题
三分法,记个模板。
以单峰函数f为例,我们要求极大值点 x ,可以在定义域 [l,r] 上取两个三等分点 lmid , rmid ,把函数分为三段。

  1. f(lmid) < f(rmid),可令 l = lmid
  2. f(lmid) > f(rmid),可令 r = rmid
  3. f(lmid) = f(rmid), l = lmid 或 r = rmid 均可

AC代码

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-6;
double a[20];
double fac(double x,int r)
{
   double ans=1;
   for(int i=1;i<=r;i++)
    ans*=x;
   return ans;
}
double check(double x,int n)
{
    int i=1;
   double ans=0;
   for(int i=1;i<=n+1;i++)
   ans+=a[i]*fac(x,n-i+1);
   return ans;
}
int main()
{
    int n;
    double l,r;
    cin>>n>>l>>r;
    for(int i=1;i<=n+1;i++)
        cin>>a[i];
    while(r-l>eps)
    {
      double lmid=l+(r-l)/3.0,rmid=r-(r-l)/3.0;
      if(check(lmid,n)<=check(rmid,n))
        l=lmid;
      else
        r=rmid;
    }
    printf("%.5lf",l);
return 0;
}

这个%f输出真是让人搞不懂,%lf就出来一堆奇怪的东西

posted @ 2020-03-19 11:08  Pecoz  阅读(111)  评论(0编辑  收藏  举报