HDU3714 Error Curves(2010 Asia Chengdu Regional Contest)

bigbigship發表於2014-08-24

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=3714

題意:給定開口向上的二次函式n個f[i] (0<i<n) 定義F(x)=max(si(x)); si(x)表示對於f[i] 當未知數取值x的時候對應的函式值

求F(x) (1<=x<=1000)的最小值

因為f(x)是一個下凸函式所以F(x)也是一個下凸函式,用三分來求最優解,此題精度卡的比較死。

程式碼如下:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int maxn = 10010;

const double eps= 1e-9;

int a[maxn],b[maxn],c[maxn],n;

double calu(double x){
    double ans = a[0]*x*x+b[0]*x+c[0];
    for(int i=1;i<n;i++){
        double t=a[i]*x*x+b[i]*x+c[i];
        if(t>ans) ans=t;
    }
    return ans;
}

double there_search()
{
    double l=0.0,r=1000.0;
    double ll,rr;
    while(l+eps<r){
        ll=(2*l+r)/3;
        rr=(2*r+l)/3;
        if(calu(ll)>calu(rr))
            l=ll;
        else
            r=rr;
    }
    return l;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d%d%d",&a[i],&b[i],&c[i]);
        double ans=there_search();
        printf("%.4lf\n",calu(ans));
    }
    return 0;
}


相關文章