uva 1476 Error Curves 题解

题意:给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 }

 

posted @ 2015-03-01 16:03  lowsfish  阅读(426)  评论(0编辑  收藏  举报