zoj 3421 Error Curves(三分)

题目: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]; 我觉得更好。

你可能感兴趣的:(ZOJ,三分搜索)