【模板】三分法
题目描述
如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减。试求出x的值。
输入输出格式
输入格式:
第一行一次包含一个正整数N和两个实数l、r,含义如题目描述所示。
第二行包含N+1个实数,从高到低依次表示该N次函数各项的系数。
输出格式:
输出为一行,包含一个实数,即为x的值。四舍五入保留5位小数。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n; double l, r, ans, a[20]; double cal(double x, int cishu) { double res = 1; for (int i = 1; i <= cishu; i++) res *= x; return res; } double check(double x) { double res = 0; for (int i = n; i >= 1; i--) res += cal(x, i) * a[i]; return res; } int main() { cin >> n >> l >> r; for (int i = n; i >= 1; i--) cin >> a[i]; for (int i = 1; i <= 100; i++) { double lmid = l + (r - l) / 3, rmid = l + (r - l) / 3 * 2; if (check(lmid) > check(rmid)) r = rmid; else l = lmid; } if (check(l) > check(r)) ans = l; else ans = r; printf("%.5lf\n", ans); return 0; }