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 }