【三分】洛谷3382[三分法]题解

来源:互联网 发布:淘宝注册手机验证码 编辑:程序博客网 时间:2024/06/08 08:37

题目概述

给出一个 n 次函数 f(x) ,求 f(ans)=f(x)max,x[L,R] ,保证 f(x)[L,R] 上是单峰函数且 [L,ans] 递增, [ans,R] 递减。

解题报告

最近考试考三分,然后并没有看出来+不会,所以学一下三分然后水博客

对于先递增再递减的单峰函数(可以不严格递增递减)的峰值,我们可以找到 midLmidR 两个三等分点( midL<midR ),然后判断:

  1. f(midL)>f(midR) ,则 ans 不可能出现在 [midR,R] ,考虑 midL 在递增段上和递减段上,很容易证明。那么此时 R=midREps
  2. f(midL)f(midR) ,则 ans 不可能出现在 [L,midL] (同理)。那么此时 L=midL+Eps

先递减再递增的单谷函数也是一样的。

示例程序

#include<cstdio>#include<cmath>using namespace std;typedef double DB;int n;DB a[15],L,R;inline int fcmp(DB a,DB b) {if (fabs(a-b)<1e-10) return 0;if (a<b) return -1;return 1;}inline DB F(DB x) {DB f=0,s=x;for (int i=n;i;i--,s*=x) f+=s*a[i];return f;}int main(){    freopen("program.in","r",stdin);    freopen("program.out","w",stdout);    scanf("%d%lf%lf",&n,&L,&R);for (int i=1;i<=n;i++) scanf("%lf",&a[i]);    while (fcmp(L,R)<=0)    {        DB t=(R-L)/3,midL=L+t,midR=R-t;        if (fcmp(F(midL),F(midR))>0) R=midR-1e-6; else L=midL+1e-6;    }    return printf("%.5lf\n",L),0;}
原创粉丝点击