您的位置:首页 > 其它

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

2017-10-01 13:46 302 查看

题目概述

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

解题报告

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

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

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: