三分法用来求解函数的极值,极值左右区间满足单调性。
我们使用类似二分的思想来求解 极大值(极小值同理):
我们定义 (displaystyle mid = frac{l+r}{2}),(displaystyle mmid = frac{mid+r}{2}),分类讨论:
- 如果 (f(mid) > f(mmid)):
- 如果二者在同侧,(f(mid)) 更靠近 极大值,舍去 ((mmid, r]) 区间;
- 如果二者在极大值两侧,舍去其中一边都可以,不影响答案区间。
- 如果 (f(mid) < f(mmid)):
- 如果二者在同侧,(f(mmid)) 更靠近 极大值,舍去 ([l, mid)) 区间;
- 如果二者在极大值两侧,舍去其中一边都可以,不影响答案区间。
- 如果 (f(mid) = f(mmid)):
- 二者一定在极大值两侧,舍去其中一边都可以。
容易实现。
以下是代码:(题面:LG3382 )
#include <cstdio>
#define eps 1e-6
int n; double l, r, a[14], mid, mmid;
inline double calc(double x) {
double res = 0;
for (int i=0; i<=n; i++) res = res * x + a[i];
return res;
}
int main() {
scanf("%d%lf%lf", &n, &l, &r);
for (int i=0; i<=n; i++) scanf("%lf", &a[i]);
while (r > l + eps) {
mid = (l + r) / 2.0;
mmid = (mid + r) / 2.0;
if (calc(mid) > calc(mmid)) r = mmid;
else l = mid;
}
printf("%.5f
", l);
return 0;
}