题意:给出n条二次曲线 Si(x) = ai x*x + bi * x + ci, F(x) = max{ Si(x) },求[1,1000]的F函数最小值
思路:无论n等于多少,最终形成的函数图像总是下凸的,所以可以用三分法求解,注意控制精度问题
#include<cstdio>
#include<cstring>
#include<algorithm>
const double eps = 1e-10;
const int maxn = 1e4 + 5;
const double INF = 1e18;
using namespace std;
int a[maxn], b[maxn], c[maxn];
int n, T, kase = 1;
double f(int a, int b, int c, double x) { return x * x * a + b * x + c; }
int main() {
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d %d %d", &a[i], &b[i], &c[i]);
double L = 0, R = 1000;
while(R - L > eps) {
double mid = (L + R) / 2;
double mmid = (mid + R) / 2;
double ans1 = -INF, ans2 = -INF;
for(int i = 0; i < n; i++) {
ans1 = max(ans1, f(a[i], b[i], c[i], mid));
ans2 = max(ans2, f(a[i], b[i], c[i], mmid));
}
if(ans1 - ans2 > eps) L = mid;
else R = mmid;
}
double ans = -INF;
for(int i = 0; i < n; i++) {
ans = max(ans, f(a[i], b[i], c[i], L));
}
printf("%.4f\n", ans);
}
return 0;
}