三分法用来求解函数的极值,极值左右区间满足单调性。
我们使用类似二分的思想来求解 极大值(极小值同理):
我们定义 \(\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)\):
- 二者一定在极大值两侧,舍去其中一边都可以。
容易实现。
以下是代码:(题面:)
#include#define eps 1e-6int 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\n", l); return 0;}