【模板】三分

题目网址
【洛谷传送门】

可以退火,但是没有打,感觉调参比较麻烦,就打了一个三分。
三分的原理与二分类似,将区间分成3份,在这道题目中,我们判断两个节点中的哪一个函数值较大,然后舍去另外一半的区间就可以了。

#include <bits/stdc++.h>
#define db double 
#define N 25
using namespace std;
const db eps = 1e-12;
db ans, l, r;
int n;
db a[N];
db calc(db x) {
    db res = 0.0, tmp = 1.0;
    for (int i = 0; i <= n; i ++) 
        res += tmp * a[i], tmp *= x;
    return res;
}
int main() {
    scanf("%d%lf%lf", &n, &l, &r);
    for (int i = 0; i <= n; i ++) scanf("%lf", &a[n - i]);
    while (fabs(l - r) >= eps) {
        db lmid = l + (r - l) / 3.0, rmid = r - (r - l) / 3.0;
        if (calc(lmid) >= calc(rmid)) r = rmid;
        else l = lmid;
    }
    printf("%.5lf\n", l);
    return 0;
}
posted @ 2019-03-28 22:40 chhokmah 阅读(...) 评论(...) 编辑 收藏