P1883 函数

题意:

 

 思路:根据题目中给出的a的取值范围是【0,100】,可以判断所有的二次函数都是开口向上的函数

   然后F函数,是所有二次函数的总和,取每一个横坐标对应的最大值

   可以发现,这一颗总和的树是开口向上的弧形

   所以,就可以跑三分了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e4+10;
 4 double a[maxn],c[maxn],b[maxn];
 5 int n;
 6 double F(double x){
 7     double bns=a[1]*x*x+x*b[1]+c[1];
 8     for(int i=2;i<=n;i++)
 9         bns=max(bns,x*x*a[i]+x*b[i]+c[i]);
10     return bns;
11 }
12 int main()
13 {
14     int T;
15     scanf("%d",&T);
16     while(T--){
17         scanf("%d",&n);
18         for(int i=1;i<=n;i++)
19             scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
20         double L=0;double R=1000.0;
21         while(R-L>=0.0000000001){
22             double mid1=(L+R)/2;
23             double mid2=(mid1+R)/2;
24             if(F(mid1)>F(mid2))
25                 L=mid1;
26             else R=mid2;
27         }
28         printf("%.4f\n",F(L));
29     }
30     return 0;
31 }
View Code

 

posted @ 2020-04-12 20:02  古比  阅读(159)  评论(0编辑  收藏  举报