题意:给出H(灯高度),h(人高度),D(灯到对面墙的高度),求L的长度(影子的长度)
分析:影子可能只打到墙上,可能既打到墙上又打到地上,也可能只打到地上
当只打到地上,当头刚好打到墙和地面的接触点,显然影子最长,影子长度L=h/H*D
当只打到墙上,影子长度必然就是人高
地上和墙上都有影子的时候,分别延长光线和地面线的交于一点,夹角为Θ角,夹角
有限制,tanΘ>=H/D,分界点是人头打在地面和强的接触线,当人再向左移动,D必
必定满足不了输入的D,tanΘ<=(H-h)/D,此时人刚好贴着墙站,
设影子打到墙上的高度是x,延长的做出的三角则为x/tanΘ;
推断出公式-((H-h)/tanΘ+DtanΘ)+D+H,然后根据一般不等式a+b>=2√ab;
tanΘ=√(H-h)/D
#include<stdio.h>
#include<math.h>
int main()
{
double H,h,D,t,l;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf",&H,&h,&D);
l=h/H*D;
double k=sqrt((H-h)/D);
if(k>H/D || k<(H-h)/D)
{
if(l>h) printf("%.3f\n",l);
else printf("%.3f\n",h);
}
else
{
t=D+H-2*sqrt(D*(H-h));
if(t<l)
{
double temp=t;
t=l;
l=temp;
}
if(t<h)
{
double temp=t;
t=h;
h=temp;
}
printf("%.3f\n",t);
}
}
return 0;
}