这题只需要注意一个点,就是所有二次函数的二次系数都是大于0的,这说明这是个下凸函数,而且最小值旁边都是单调的,对于求区间凸函数极值问题,套三分模板即可。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int T,n,a,b,c;
int arr[100005][3];
double f(double mid)
{double ans=-1e18;for(int i=0;i<n;i++){ans=max(ans,arr[i][0]*mid*mid+arr[i][1]*mid+arr[i][2]);}return ans;
}
bool check(double lmid,double rmid)
{return f(lmid)>=f(rmid);
}
int main()
{cin>>T;while(T--){cin>>n;for(int i=0;i<n;i++){cin>>a>>b>>c;arr[i][0]=a;arr[i][1]=b;arr[i][2]=c;}double l=0,r=1000;double exp=1e-8;while(r-l>exp){double lmid=l+(r-l)/3,rmid=r-(r-l)/3;if(check(lmid,rmid)){l=lmid+exp;}else{r=rmid;}}cout<<fixed<<setprecision(4)<<f(l)<<endl;}return 0;
}
需要注意的是exp需要到1e-8级别,要不然可能会寄。