题意是给定如图的H,h,D,求最大的影子L。
如图所示,设X,Y。
由三角形相似得,x / y = H / (y + D) 。
解得:y = x * D / (H - x)。
由三角形相似得,x / y = h / (y + L -x)。
带入y,解得 L = x + D * (h - x) / (H - x)。
对L 求一阶导数,并令L ’ = 0,得:
x = H +- sqrt(D * (H - h))。
因为 x 必定小于 H, 所以 x = H - sqrt(D * (H - h))。
当 x <= 0 及 x >= h 时,不符合实际意义。
当:x <= 0,带入计算, 即 H * H <= D * (H - h),由相似三角形ans = h / H * D。
当:x >= h,带入计算, 即 H - h >= D,得最大时即为人靠墙时,ans = h。
本题也可以用三分做,但是三分还不大理解。
计算几何代码:
#include <stdio.h>
#include <math.h>
int main()
{
int ncase;
scanf("%d", &ncase);
while (ncase--)
{
double H, h, D;
double ans = 0.0;
scanf("%lf%lf%lf", &H, &h, &D);
if (H - h >= D)
{
ans = h;
}
else if (H * H <= D * (H - h))
{
ans = h / H * D;
}
else
{
double x = H - sqrt(D * (H - h));
ans = x + D * (h - x) / (H - x);
}
printf("%.3lf\n", ans);
}
return 0;
}