https://www.luogu.org/problemnew/show/P3382
二分用于单调函数, 三分用于凹凸函数.
三分就是把区间分成三份, 设左右端点为L和R, 有两种分法。
第一种是区间内的第一个点lmid = (L + R) / 2, 第二个点rmid = (lmid + R) / 2。
第二种是lmid = l + (r – l) / 3, rmid = l + 2 * (r – l) / 3。
然后判断函数在这两个位置的值,根据实际情况缩小答案的区间。
比如求凸函数最大值,如果f(lmid) < f(rmid), 则L = lmid,否则R = rmid。 然后循环一定次数保证精度,最后的R就是最大值点。 如果是整数三分,那就是L = lmid + 1,否则R = rmid - 1。 注意1e-5的精度至少64次,1e-6建议100次。 实数三分:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 5, mod = 1e9 + 7;
int n;
double a[15];
double F(double x)
{