函数
题目描述
给定 n n n 个二次函数 f 1 ( x ) , f 2 ( x ) , … , f n ( x ) f_1(x),f_2(x),\dots,f_n(x) f1(x),f2(x),…,fn(x)(均形如 a x 2 + b x + c ax^2+bx+c ax2+bx+c),设 F ( x ) = max { f 1 ( x ) , f 2 ( x ) , . . . , f n ( x ) } F(x)=\max\{f_1(x),f_2(x),...,f_n(x)\} F(x)=max{f1(x),f2(x),...,fn(x)},求 F ( x ) F(x) F(x) 在区间 [ 0 , 1000 ] [0,1000] [0,1000] 上的最小值。
输入格式
输入第一行为正整数 T T T,表示有 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] 上的最小值。答案精确到小数点后四位,四舍五入。
样例 #1
样例输入 #1
2
1
2 0 0
2
2 0 0
2 -4 2
样例输出 #1
0.0000
0.5000
提示
对于 50 % 50\% 50% 的数据, n ≤ 100 n\le 100 n≤100。
对于 100 % 100\% 100% 的数据, T < 10 T<10 T<10, n ≤ 1 0 4 \ n\le 10^4 n≤104, 0 ≤ a ≤ 100 0\le a\le 100 0≤a≤100, ∣ b ∣ ≤ 5 × 1 0 3 |b| \le 5\times 10^3 ∣b∣≤5×103, ∣ c ∣ ≤ 5 × 1 0 3 |c| \le 5\times 10^3 ∣c∣≤5×103。`
#include <bits/stdc++.h>
using namespace std;
int T,n;
double a[1000000],b[1000000],c[1000000],l,r,L,R,tmp;
double calc(double x)
{
double maxn=-1e8;
for (int i=1;i<=n;i++)
maxn=max(maxn,a[i]*x*x+b[i]*x+c[i]);
return maxn;
}
bool check(double a,double b)
{
return calc(a)<=calc(b);
}
int main() {
cin>>T;
while(T--)
{
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i]>>b[i]>>c[i];
l=0;r=1000;
while(r-l>1e-11)
{
tmp = (r-l)/3;
L=l+tmp;R=r-tmp;
if (check(L,R)) r=R;
else l=L;
}
printf("%.4lf\n",calc(l));
}
return 0;
}
1.用三分缩小函数取值区间
2.答案输出的是最大的函数值