(普通三分算法)
为什么三分的时候判断
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;
}