用途
用于寻找单峰函数的极值.
单峰函数:存在某个点,使得这个点的左侧保持单调递增(递减),右侧保持单调递减(递增).
实现
其实很简单,画个图稍微讨论一下就行.
设
m
i
d
l
=
(
l
+
r
)
/
2
midl=(l+r)/2
midl=(l+r)/2,
m
i
d
r
=
(
m
i
d
l
+
r
)
/
2
midr=(midl+r)/2
midr=(midl+r)/2.
比较二者的大小关系即可.
代码(洛谷模板)
#include <cstdio>
#include <algorithm>
#include <cstring>
#define db double
using namespace std;
const double eps = 1e-6;
int n;
db l,r;
db a[15];
db f(db x)
{
db res = 0,k = 1;
for (int i = n + 1 ; i >= 1 ; i--) res = res + k * a[i],k = k * x;
return res;
}
int main()
{
scanf("%d%lf%lf",&n,&l,&r);
for (int i = 1 ; i <= n + 1 ; i++) scanf("%lf",&a[i]);
while (l + eps < r)
{
db midl = (l + r) / 2;
db midr = (midl + r) / 2;
if (f(midl) > f(midr)) r = midr;
else l = midl;
}
printf("%.5lf\n",l);
return 0;
}