题目描述
明明做作业的时候遇到了 n n n 个二次函数 S i ( x ) = a x 2 + b x + c S_i(x)= ax^2 + bx + c Si(x)=ax2+bx+c,他突发奇想设计了一个新的函数 F ( x ) = max { S i ( x ) } , i = 1 … n F(x) = \max\{S_i(x)\}, i = 1\ldots n F(x)=max{Si(x)},i=1…n。
明明现在想求这个函数在 [ 0 , 1000 ] [0,1000] [0,1000] 的最小值,要求精确到小数点后四位,四舍五入。
输入格式
输入包含 T T T 组数据,每组第一行一个整数 n n n;
接下来 n n n 行,每行 3 3 3 个整数 a , b , c a, b, c a,b,c ,用来表示每个二次函数的 3 3 3 个系数。注意:二次函数有可能退化成一次。
输出格式
每组数据输出一行,表示新函数 F ( x ) F(x) F(x) 的在区间 [ 0 , 1000 ] [0,1000] [0,1000] 上的最小值。精确到小数点后四位,四舍五入。
样例
输入
2
1
2 0 0
2
2 0 0
2 -4 2
输出
0.0000
0.5000
数据范围与提示
对于 50 % 50\% 50% 的数据, 1 ≤ n ≤ 100 1 \leq n \leq 100 1≤n≤100;
对于 100 % 100\% 100% 的数据, 1 ≤ T ≤ 10 , 1 ≤ n ≤ 1 0 5 , 0 ≤ a ≤ 100 , 0 ≤ ∣ b ∣ ≤ 5000 , 0 ≤ ∣ c ∣ ≤ 5000 1 \leq T \leq 10, 1 \leq n \leq 10^5, 0 \leq a \leq 100, 0 \leq |b| \leq 5000, 0 \leq |c| \leq 5000 1≤T≤10,1≤n≤105,0≤a≤100,0≤∣b∣≤5000,0≤∣c∣≤5000。
思路
标准三分,不过多赘述。
code
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
int n;
double l, r, mid1, mid2;
struct node
{
double a;
double b;
double c;
} ans[100005];
double f(double x) {
double cnt = -1.00000000;
for (int i = 0; i < n; i++) {
cnt = max(cnt, ans[i].a * x * x + ans[i].b * x + ans[i].c);
}
return cnt;
}
int main() {
int v;
cin >> v;
while (v--) {
cin >> n;
for (int i = 0; i < n; i++)
cin >> ans[i].a >> ans[i].b >> ans[i].c;
l = 0.0;
r = 1000.0;
while (l + eps <= r)
{
mid1 = l + 1.0 * (r - l) / 3;
mid2 = r - 1.0 * (r - l) / 3;
if (f(mid1) < f(mid2)) r = mid2;
else if (f(mid1) > f(mid2)) l = mid1;
else
{
l = mid1;
r = mid2;
}
}
printf("%.4lf\n", f(r));
}
return 0;
}