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 ",F(l));//注意最后输出的是函数值 50 } 51 return 0; 52 }