三分法(误差曲线,LA 5009)

来源:互联网 发布:祝99什么意思网络用语 编辑:程序博客网 时间:2024/04/28 10:41

一开始没想清楚。。。以为要分段然后三分。。。然后果断超时了。。。

其实由于函数是取所有凹函数的最大值,所以复合起来也是凹函数,直接在[0,1000]上三分就好了。。。


至于三分多少次的问题,有两种解决办法,

一是设eps,一旦精度足够就果断结束。

二是固定三分次数,这个次数可以根据时间复杂度算出一个可行的最大值,比如这道题,T=100,n=10000,时限3000ms,所以固定三分100次是个可行的最大值。


代码

#include<bits/stdc++.h>#define maxn 10010using namespace std;const double eps=1e-6;int n;double a[maxn],b[maxn],c[maxn];double f(double x){    double ret=a[0]*x*x+b[0]*x+c[0];    for(int i=1;i<n;i++)        ret=max(ret,a[i]*x*x+b[i]*x+c[i]);    return ret;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=0;i<n;i++)            scanf("%lf %lf %lf",&a[i],&b[i],&c[i]);        double l=0,r=1000;        while(1)        {            double ml=l+(r-l)/3;            double mr=r-(r-l)/3;            double ansl=f(ml);            double ansr=f(mr);            if(fabs(f(l)-ansl)<eps&&fabs(f(r)-ansr)<eps)            {                printf("%.4lf\n",ansl);                break;            }            if(ansl>ansr) l=ml;            else r=mr;        }    }    return 0;}


0 0