题意:这题题意比较难读懂,题目的意思是给出一系列的一元二次曲线Si(x),F(x)为定义域内每一个x对应的Si(x)最大值点组成的曲线,求F(x)的最小值。
分析:由于a>=0,开口向上已确定,所以F(x)一定是凹曲线,故可以用三分查找法找出它的极值点,然后求出该极值点对应的最小值。注意求解F(x)在任一点的函数值时要注意枚举ai,bi,ci,从而求出Si(x)在该点的最大值即为F(x)在该点的值。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const double eps=1e-9; //eps卡AC,最大只能是1e-9,1e-8或更大就会wa。。。
const int maxn=10005;
int n;
double a[maxn],b[maxn],c[maxn];
double f(double x) //求出F(x)的值
{
double M;
for(int i=0;i<n;i++)
{
//cout<<a[i]<<"---"<<b[i]<<"---"<<c[i]<<endl;
if(i==0) M=a[i]*x*x+b[i]*x+c[i];
else M=max(M,a[i]*x*x+b[i]*x+c[i]);
}
return M;
}
int main()
{
int T;
cin>>T;
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lf%lf%lf",a+i,b+i,c+i);
double l=0,r=1000;
while(l+eps<r) //三分求极值点
{
double mid=(l+r)/2;
double mmid=(mid+r)/2;
if(f(mid)>f(mmid)) l=mid;
else r=mmid;
//cout<<"r="<<r<<endl;
}
printf("%.4f\n",f(r));
}
return 0;
}