题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4105
大意:很多的函数曲线,二次或一次,要构造这样的新曲线,对于每个x,新曲线对应的Y值是原来所有函数对应值的最大值。要求出新曲线上最小的y值。
新曲线还是具有二次曲线的性质,所以应当用三分法来完成查找。对于每条函数曲线都得计算y值,最后选出最大的Y,此处只能暴力计算了。
#include <iostream>
#include<cstdio>
using namespace std;
double a[10005],b[10005],c[10005];
int t,n;
double cal(double x){
double ans=a[0]*x*x+b[0]*x+c[0]; //good
for(int i=1;i<n;i++){
double res=a[i]*x*x+b[i]*x+c[i];
if(ans<res)ans=res;
}
return ans;
}
int main()
{
//freopen("cin.txt","r",stdin);
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 low=0.0,high=1000.0,mid1,mid2;
while(high-low>1e-12){
mid1=low+(high-low)/3;
mid2=high-(high-low)/3;
if(cal(mid1)>cal(mid2))low=mid1;
else high=mid2;
}
printf("%.4lf\n",cal(low));
}
return 0;
}
函数double cal(double x)中ans最初的取值可以取-1e10,当时自己脑子短路,写了个1e-10,结果不断的WA。写成ns=a[0]*x*x+b[0]*x+c[0]; 我觉得更好。