UVA 1476/HDU 3714/ZOJ 3421 Error Curves 三分法

#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100010;
int n,a[maxn],b[maxn],c[maxn];
double fun(double x)
{
    double ans=a[0]*x*x+b[0]*x+c[0];
    for(int i=1;i<n;i++)
        ans=max(ans,a[i]*x*x+b[i]*x+c[i]);
    return ans;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int i,j,k;
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d%d%d",&a[i],&b[i],&c[i]);
        double l=0,r=1000.0,m1,m2;
        while(r-l>1e-10)
        {
            m1=l+(r-l)/3;
            m2=r-(r-l)/3;
            if(fun(m1)<fun(m2))r=m2;
            else l=m1;
        }
        printf("%.4lf\n",fun(l));
    }
}
/*
    经研究可知,所有可能组合得到的图形都是先递减后递增的下凸函数,用三分法求解
*/

你可能感兴趣的:(三分法)