Problem A
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 137 Accepted Submission(s) : 48
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
题目分析:
1)
此题已知H,h,D,求影子的长度
由实际经验知,影子的变化分为两阶段 设ε 为此状态的临界点, 当X<ε 时,影子长度逐渐变大;x=ε 时,影子长度达到最大,此时影子末点到达墙角;x>ε 时,影子长度逐渐减小,直到人到达墙壁;
所以 这个影子长度图像为一个开口向下的抛物线
求抛物线的某一点(最大值点或最小值点),可以采用三分法
2)最后输出的坐标可以为任意一点,left right mid mmid ,均可
代码如下:
#include<stdio.h>
#define eps 1e-9
double x,limit,H,h,D;
double f(double x)
{
if(x<limit)
return h*x/(H-h);
else
return D-x+H-H*D/x+h*D/x;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf",&H,&h,&D);
limit=D-D*h/H;
double left=0.0,right=D;
double mid,mmid;
while(right-left>eps)
{
mid=(left+right)/2.0;
mmid=(mid+right)/2.0;
if(f(mid)>f(mmid))
{
right=mmid;
}
else
left=mid;
}
printf("%.3lf\n",f(mmid));
}
return 0;
}