题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3366
题意:
在灯、人头、墙角成一条直线时,人从灯下走到墙的高度等于自己的身高的过程中,影子长度的最大值。
分析:
影子长为a,在人到达墙角时影子长为b,我们可以写出人在这两点间时影子的方程:(x*H-D*h)/(x-D)+x,
可知这个方程在【[a,b]之间是凸的,即先增加后减小,有极值,可以用三分法高效求解。
//题目:HDU 3714
//时间:2015-4-13 13:45
//作者:Miki
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
const double eps=1e-9;
double H,h,D;
double Calc(double x)
{
return (x*H-D*h)/(x-D)+x;
}
double Solve()
{
//三分
double Left = 0, Right = D * h / H;
double mid, midmid;
double mid_value, midmid_value;
while (Left + eps < Right)
{
mid = (Left + Right) / 2.0;
midmid = (mid + Right) / 2.0;
mid_value = Calc(mid);
midmid_value = Calc(midmid);
// 求解最大极值
if (mid_value >= midmid_value)
Right= midmid;
else
Left = mid;
}
return midmid_value;
}
int main()
{
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lf %lf %lf",&H,&h,&D);
printf("%.3lf\n",Solve());
}
return 0;
}