F(x)是一个凸函数(convex function)
用三分(ternary search)可求最小值点
另外,EPS设置成>1e-9会WA
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 10000 + 10;
const double EPS = 1e-9;
int n;
int a[MAX_N], b[MAX_N], c[MAX_N];
double F(double x) {
double res = a[0] * x * x + b[0] * x + c[0];
for (int i = 1; i < n; i++) {
res = max(res, a[i] * x * x + b[i] * x + c[i]);
}
return res;
}
double ternary_search(double l, double r) {
while (r - l > EPS) {
double m1 = l + (r - l) / 3;
double m2 = r - (r - l) / 3;
if (F(m1) < F(m2)) r = m2;
else l = m1;
}
return F(l);
}
int main() {
int T;
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);
}
printf("%.4f\n", ternary_search(0, 1000));
}
return 0;
}