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); }}