标签:
题意:给n个二次函数f(x),定义F(x)=max(f(x)),即n个二次函数中的最大值。求F(x)在区间[1,1000]内的最小值。
根据题意可以知道,F(x)是单峰函数。于是我们可以三分解决。对于区间[L,R],找它的三等分点M1,M2,如果F(M1)<F(M2),则答案在[L,M2],否则在[M1,R]。
精度最好高一点。。只差一两个数量级是不行的,因为有函数会放大误差。。
1 #include<cstdio> 2 #include<algorithm> 3 const int MAXN=10000+5; 4 int n; 5 int a[MAXN],b[MAXN],c[MAXN]; 6 inline double f(int i,double x) 7 { 8 return a[i]*x*x+b[i]*x+c[i]; 9 } 10 inline double F(double x) 11 { 12 double ans=f(0,x); 13 for(int i=1;i<n;++i) 14 ans=std::max(ans,f(i,x)); 15 return ans; 16 } 17 int T; 18 int main() 19 { 20 // freopen("1.in","r",stdin); 21 scanf("%d",&T); 22 while(T--) 23 { 24 scanf("%d",&n); 25 for(int i=0;i<n;++i) scanf("%d%d%d",a+i,b+i,c+i); 26 double L=0.0,R=1000.0; 27 while(R-L>1e-9) 28 { 29 double M1=L+(R-L)/3,M2=R-(R-L)/3; 30 if(F(M1)>F(M2)) L=M1; 31 else R=M2; 32 } 33 printf("%.4f\n",F(L)); 34 } 35 return 0; 36 }
标签:
原文地址:http://www.cnblogs.com/lowsfish/p/4307193.html