用于投影Light Bulb(三分)

最近朋友几篇文章介绍了改用于投影的文章. 关联文章的地址

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

    


Light Bulb

Time Limit: 1 Second      Memory Limit: 32768 KB

Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house is narrow and he has only one light bulb in his house. Every night, he is wandering in his incommodious house, thinking of how to earn more money. One day, he found that the length of his shadow was changing from time to time while walking between the light bulb and the wall of his house. A sudden thought ran through his mind and he wanted to know the maximum length of his shadow.

用于和投影

Input

The first line of the input contains an integer T (T <= 100), indicating the number of cases.

Each test case contains three real numbers H, h and D in one line. H is the height of the light bulb while h is the height of mildleopard. D is distance between the light bulb and the wall. All numbers are in range from 10-2 to 103, both inclusive, and H- h >= 10-2.

Output

For each test case, output the maximum length of mildleopard's shadow in one line, accurate up to three decimal places..

Sample Input

 

3
2 1 0.5
2 0.5 3
4 3 4

 

Sample Output

 

1.000
0.750
4.000

 


Author:   GUAN, Yao
Source:   The 6th Zhejiang Provincial Collegiate Programming Contest
Submit      Status
    每日一道理
在每个人心中,都曾停留过那些值得怀念的人,也许还在,也许早已消逝,在茫茫人海中丢失,于是,那份怀念便得凄凉,因为模糊的记忆中只剩下一个“空壳”,没有什么,甚至连自己的心都装不下,时间把一切抹平,也把当日的泪水封锁,因为已经没有,怀念只是悲凉!

    
 

    解析:用三分法求解:

     

  三分法与二分法

    1.共同点:

    都是用于查找在某一区间上的目标值,通常是最小值,最大值,目标值等

    2.不同点:

    二分法:使用于枯燥函数,一般指递增或递减函数类型

    三分法:用于凸函数,例如;y=x^2函数类型,用于求极值

    以下是模板;

    Eps=1e-10;

    Double  cale(double x )

    {}

    二分法查找:

    Double  solvedouble  lowdouble  high,double V{

    Int mid;

    While(low+eps<high)

 {

  Mid=(low+high)/2.0;

    If(cale(mid)>V)

    High=mid;

    Else

    Low=mid;

 }

    Return low;

    }

    三分法:

    double solve(double l,double r)

    {

    double m;

    double mm;

    while(l+ep<r)//注意高精度

    {

        m=(l+r)/2.0;

        mm=(m+r)/2.0;

        if(lenth(m)>lenth(mm))//取最大值(如果取最小值的话则变成(lengthm<length(mm)))

         r=mm;

         else

         l=m;

    }

    return l;

    }

     

    这里求最大阴影长度,可以根据相似三角形求得

    L/x+L=h/H;则有L=(h*x)/(H-h)

    分为两种情况:

    一,全体投影都在地上:即x+L<=D,则输出长度为L

    二,投在了地上和墙上: L1=(D*h-D*H+H*x)/x;//墙上投影(根据相似三角形可得)

    则,输出长度为:D-x+L1

    

#include<string.h>

#include<stdio.h>

#include<math.h>

#include<algorithm>

#include <iostream>

using namespace std;

const double ep=1e-10;

double H,h,D;

double lenth(double x)

{

    double L,L1;

    L=(h*x)/(H-h);//有相似三角形性质得来

    if(x+L<=D)//当只能投影在地上时

     return L;

    L1=(D*h-D*H+H*x)/x;//墙上投影

    return D-x+L1;

}


double solve(double l,double r)

{

    double m;

    double mm;

    while(l+ep<r)//注意高精度

    {

        m=(l+r)/2.0;

        mm=(m+r)/2.0;

        if(lenth(m)>lenth(mm))//取最大值

         r=mm;

         else

         l=m;

    }

    return l;

}

int main()

{

    int T;

    double L;

    scanf("%d",&T);

    while(T--)

    { scanf("%lf%lf%lf",&H,&h,&D);

            L=lenth(solve(0,D));

            printf("%.3lf\n",L);

    }

    return 0;

}

    
 

文章结束给大家分享下程序员的一些笑话语录: 很多所谓的牛人也不过如此,离开了你,微软还是微软,Google还是Google,苹果还是苹果,暴雪还是暴雪,而这些牛人离开了公司,自己什么都不是。

--------------------------------- 原创文章 By
用于和投影
---------------------------------

你可能感兴趣的:(li)