读书人

zoj3203 Light Bulb-3分复习

发布时间: 2012-09-23 10:28:11 作者: rapoo

zoj3203 Light Bulb-----三分复习

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, andH - 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

32 1 0.52 0.5 34 3 4

Sample Output

1.0000.7504.000

根据题意可以列出方程:设在地上的那段影子的长度为l1, l1/D=(h-L)/(H-L),得到l1=(h-L)*D/(H-L),所以影子的总长度为l1+L=(h-L)*D/(H-L)+L,只有一个未知数L,把L进行三分,在(0,h)这个范围内。

#include<iostream>#include<cstdlib>#include<stdio.h>#include<algorithm>#include<math.h>#define eps 1e-15using namespace std;double H,h,D;double cal(double xx){    double ans=(h-xx)*D/(H-xx)+xx;    return ans;}double solve(){    double left,right;    double mid,midmid;    double mid_area,midmid_area;    left=0;right=h;    while(left+eps<right)    {        mid=(left+right)/2;        midmid=(mid+right)/2;        mid_area=cal(mid);        midmid_area=cal(midmid);        if(mid_area<midmid_area) left=mid;        else right=midmid;    }    return cal(right);}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%lf%lf%lf",&H,&h,&D);        double f=solve();        //double ss=cal(f);        printf("%.3lf\n",f);    }}


读书人网 >编程

热点推荐