• zoj 3203 Light Bulb 三分,求凸函数的最大值


    题目来源:

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3366

    分析:

    求影子最长。

    当人从灯往墙走距离x,当 x0=D*(H-h)/H 时,x (0.x0)一直递增。

    当 D>x > x0 影子函数为 

    f(x) = -x + (D*h -D*H) / x + D + H 为一个 凸函数。在此区间用三分,求最大值。

    代码如下:

    const double EPS=1e-9;
    double D,h,H;
    double f(double x)
    {
        return -x + (D*h - D*H) /x + D +H;
    }
    //三分 对凹(凸)函数判断最小(大)值,此题是求最小值。
    //不要求左l右r值的大小比较,即(L<R 或 L>=R)都可
    double tri_search(){
        double Mid , Midmid,L,R;
        L= D*(H - h) / H;
        R=D;
        while( L + EPS < R ){ // 由于L ,R没有要求谁大谁小,故求的绝对值
            Mid=(L+R)*0.5;
            Midmid=(Mid+R)*0.5;
            if(f(Mid)>= f(Midmid)  )
                    R=Midmid;
            else
                L=Mid;
        }
        return (L+R)*0.5;
    }
    int  main(){
        int t;
        cin>>t;
        while(t--){
            cin>>H>>h>>D;
            double ans=h*D / H;
            double x=tri_search();
            ans=max(ans, f(x));
            printf("%.3lf
    ",ans);
        }
         return 0 ;
    }
  • 相关阅读:
    db.Exec和db.Query的区别
    golang两种get请求获取携带参数的方式
    gin实现中间件middleware
    gin操作session
    笔札-有触动的句子
    并发的基本概念
    售货员的难题
    传球游戏之最小总代价
    状压dp入门
    [COCI 2010] OGRADA
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3654621.html
Copyright © 2020-2023  润新知