为什么不加k只有50分
查看原帖
为什么不加k只有50分
542881
日常放水WT双奔楼主2021/11/4 20:31

(普通三分算法)

为什么三分的时候判断

f(lsec) < f(rsec)

要改成

f(lsec + k) < f(rsec - k)

#include <bits/stdc++.h>
#define _for(i, a, b) for(int i = a; i <= b; i++)
#define _rfor(i, a, b) for(int i = a; i >= b; i--)
using namespace std;
constexpr int maxn = 13;
constexpr double eps = 1e-5;
int n;
double a[maxn + 10];
double l, r;
void init()
{
    scanf("%d %lf %lf", &n, &l, &r);
    _rfor(i, n, 0) scanf("%lf", &a[i]);
    return ;
}
double f(double x)
{
    double f = 0;
    _for(i, 0, n) f += a[i] * pow(x, i);
    //printf("f(%f) == %f\n", x, f);
    return f;
}
double ter(double lsec, double rsec)
{
    if (rsec - lsec <= eps) return lsec;
    double k = (rsec - lsec) / 3;
    //printf("search in: %f----%f\n", lsec, rsec);
    if (f(lsec) < f(rsec)) //这行改为f(lsec + k) < f(rsec - k)后就AC了
    {
        //printf("mode 1\n");
        return ter(lsec + k, rsec);
    }
    else
    {
        //printf("mode 2\n");
        return ter(lsec, rsec - k);
    }
}
int main(int argc, char **argv)
{
    init();
    printf("%.5lf\n", ter(l, r));
    return 0;
}
2021/11/4 20:31
加载中...