1 /*LA5009:
2 定义 fi(x)=a[i]*x^2+b[i]*x+c[i](a[i]>=0),F(x)=max(fi(x)),0<=x<=1000
3 求F(x)在区间上的最小值
4 三分法模板题:总结一下:
5 1、三分法适用类型,a:凹函数的最大值的最小值,b:凸函数的最小值的最大值。
6 必须是单峰函数啊
7 2、特点:升维,记住三分法不是用来解零点的
8 3、解法:a类型,取三分点m1,m2,m1<m2,若F(m1)<F(m2) 则 解在(l,m2)上 ,否则在(m1,r)上
9 b类型,解在靠近大的值得区间上
10 */
11 #include<iostream>
12 #include<stdio.h>
13 #include<string.h>
14 #include<algorithm>
15 #include<stdlib.h>
16 #include<cmath>
17 #include<queue>
18 #include<vector>
19 #include<map>
20 #define eps 1e-10
21 #define LL long long
22 using namespace std;
23 int n,T;
24 double a[10000+5],b[10000+5],c[10000+5];
25 double f(int i,double x)
26 {
27 return a[i]*x*x+b[i]*x+c[i];
28 }
29
30 double F(double x)
31 {
32 double m=f(0,x);
33 for(int i=1;i<n;i++) m=max(m,f(i,x));
34 return m;
35 }
36 int main()
37 {
38 cin>>T;
39 for(int cas=1;cas<=T;cas++)
40 {
41 cin>>n;
42 for(int i=0;i<n;i++) cin>>a[i]>>b[i]>>c[i];
43 double l=0,r=1000;
44 while(r-l>eps)
45 {
46 double m1=l+(r-l)/3,m2=m1+(r-l)/3;
47 if (F(m1)<F(m2)) r=m2;else l=m1;
48 }
49 printf("%.4lf\n",F(l));//注意最后输出的是函数值
50 }
51 return 0;
52 }