「一本通 1.2 例 3」曲线

https://loj.ac/problem/10013

题解:这道题运用的是新方法三分,然后稍微总结一下三分(就是说具有一定的单调性,找最大最小值,然后和二分基本类似,就是说特性就是说当前两个点比较,较优的点和最优点在相对了较差点的同侧,就是说那边差就把范围定到那里去)

错误:要注意精度问题,一般定到1e-9或1e-11;

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int t,n;
double a[101000],b[101000],c[101000];
double f(double x){
    double maxa=-1e9;
    for(int i=1;i<=n;i++)
        maxa=max(maxa,x*x*a[i]+x*b[i]+c[i]);
    return maxa;
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lf%lf%lf",&a[i],&b[i],&c[i]);
        double l=0.0,r=1000.0,eps=1e-11;//wrong
        while(r-l>eps){
            double midl=l+(r-l)/3.0,midr=r-(r-l)/3.0;
            if(f(midl)<f(midr))r=midr;
            else l=midl;
        }
        printf("%.4f\n",f(l));
    }
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/linzeli/p/10550720.html
今日推荐