zoukankan      html  css  js  c++  java
  • The 6th Zhejiang Provincial Collegiate Programming Contest->ProblemB:Light Bulb

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3203

    题意:求影子的最长长度L;

    当灯,人头和墙角成一条直线时(假设此时人站在A点),此时的长度是影子全在地上的最长长度。当人再向右走时,影子开始投影到墙上,当人贴着墙,影子长度即为人的高度。所以当人从A点走到墙,函数是先递增再递减,为凸性函数,所以我们可以用三分法来求解。

    我们假设:人距离灯的水平距离为x,则不难推出:随着x的变化,L = D - x + H - D * (H - h) / x; 是先增后减函数。

    我们立足于求其最大值。

    x的初始值我们可以假设为:D - D*h/H,因为从0开始到此,L肯定是递增的,所以不必考虑先前的。

    x最大值为D:

    题解参考:http://blog.csdn.net/niuox/article/details/8529986

    三分法详细介绍:http://www.debug4.me/Algorithm/ternary-search/

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 double H,h,D;
     5 double aa(double x) {
     6     return (h-x)*D/(H-x)+x;
     7 }
     8 int main() {
     9     double l,r,m,mm;
    10     int t;
    11     scanf("%d",&t);
    12     while(t--) {
    13         scanf("%lf%lf%lf",&H,&h,&D);
    14         l=D-D*h/H;
    15         r=h;
    16         while(l+1e-6<r) {
    17             m=(l+r)/2;
    18             mm=(m+r)/2;
    19             if(aa(m)>aa(mm))
    20                 r=mm;
    21             else
    22                 l=m;
    23         }
    24         printf("%.3lf
    ",aa(l));
    25     }
    26     return 0;
    27 }
    我会一直在
  • 相关阅读:
    业余爱好很有必要
    平和的心态
    合理预期
    有所为,有所不为
    iOS中使用UITextView设置不同文本部分点击事件小结
    一直在路上
    Windows平台交叉编译Arm Linux平台的QT5.7库
    UOS创建开机自启程序或脚本
    HTTP HTTP请求报文和响应报文的格式
    ObjectObject.prototype.toString.call()方法的使用
  • 原文地址:https://www.cnblogs.com/zhien-aa/p/5218686.html
Copyright © 2011-2022 走看看