「1.2」曲线
问题背景
「一本通1.2 例3」
题目描述
输入格式
输入包含 T 组数据,每组第一行一个整数 n;
接下来 n 行,每行 3 个整数 a, b, c ,用来表示每个二次函数的 3 个系数。注意:二次函数有可能退化成一次。
输出格式
每组数据输出一行,表示新函数 F(x) 的在区间 [0,1000] 上的最小值。精确到小数点后四位,四舍五入。
样例输入1
2
1
2 0 0
2
2 0 0
2 -4 2
样例输出1
0.0000
0.5000
注释说明
对于 50% 的数据,1≤n≤100;
对于 100% 的数据,1≤T≤10, 1≤n≤10^5, 0≤a≤1000, 0≤∣b∣≤5000, 0≤∣c∣≤5000。
#include<bits/stdc++.h>
using namespace std;
double l=0,r=1e9;
int t,n,a[100005],b[100005],c[100005];
double f(double x){
double r=-1e9;
for(int i=1;i<=n;i++){
r=max(r,a[i]*x*x+b[i]*x+c[i]);
}
return r;
}
int main() {
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d%d",&a[i],&b[i],&c[i]);
l=0;
r=1000;
while(r-l>=1e-11) {
double m1=l+(r-l)/3,m2=r-(r-l)/3;
if(f(m1)<=f(m2))r=m2;
else l=m1;
}
printf("%.4lf\n",f(r));
}
}