三分

while (l < r) {
        int midl = l + (r - l) / 3;
        int midr = r - (r - l) / 3;
        long double ansl = check(midl);
        long double ansr = check(midr);
        if (ansl < ansr)
            r = midr - 1;
        else
            l = midl + 1;
}
while (r - l > eps){
    mid = (l + r) / 2;
    double fl = f(mid - eps), fr = f(mid + eps);
    if (fl < fr)
        l = mid; // 这里不写成mid - eps,防止死循环;可能会错过极值,但在误差范围以内所以没关系
    else
        r = mid;
}

Last updated