UVA 1476 Error Curves

来源:互联网 发布:log4j保存到数据库 编辑:程序博客网 时间:2024/06/07 14:56

题意:二次函数S=ax^2+bx+c,给出a、b、c,F(x)=max(Si)求在[0,1000]范围内的F(x)的最小值

解题思路:三分搜索.二分搜索适用于单调函数,所以这种不单调的函数要用三分

代码:

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>using namespace std;const int maxn=10000+5;const double EPS=1e-10;int n;int a[maxn],b[maxn],c[maxn];double f(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--)    {        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%d%d%d",&a[i],&b[i],&c[i]);        }        double l=0.0,r=1000.0;        while(r-l>=EPS)        {            double mid=l+(r-l)/3;            double mmid=r-(r-l)/3;            if(f(mid)<f(mmid))r=mmid;            else l=mid;        }        printf("%.4f\n",f(l));    }    return 0;}


原创粉丝点击