代码
采用三分法,然后算出[1,n]中二次函数的最大值,再进行比较就可以了。
思路
#include <bits/stdc++.h>
#define debug(x) cout<<"x="<<x<<endl
#define int long long
using namespace std;
const int maxn = 1e5 + 7;
const int mod = 1e9 + 7;
typedef long long ll;
//ifstream mycin("in.txt");
//ofstream mycout("out.txt");
inline void read(int &data) {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
f = f * -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
data = x * f;
}
int n, t, a[maxn], b[maxn], c[maxn];
double fc(double x, int y) {
return (double)a[y] * x * x + (double)b[y] * x + (double)c[y];
}
double check(double x) {
double mx = -10000000.0;
for (int i = 1; i <= n; i++) {
mx = max(mx, fc(x, i));
}
return mx;
}
signed main() {
read(t);
while (t--) {
read(n);
for (int i = 1; i <= n; i++) {
read(a[i]);
read(b[i]);
read(c[i]);
}
double l = 0, r = 1000000, midl, midr, tmp;
while (fabs(r - l) > 1e-9) {
tmp = (r - l) / 3;
midl = l + tmp;
midr = r - tmp;
if (check(midl) > check(midr))
l = midl;
else
r = midr;
}
printf("%.4lf\n", check(l));
}
return 0;
} 
京公网安备 11010502036488号