原题链接
解题思路:三分 + 相似三角形,人从最左边走到最右边,我们发现影子的长度是先递增然后递减的,所以影子长度的函数具有凹凸性,所以我们可以用三分来求极值
C++代码
#include <bits/stdc++.h>
using namespace std;
double H, D, h;
double check(double x)
{
if (x <= D * h / H) return x + H - (H - h) * D / (D - x);
else return (D - x) * h / (H - h);
}
int main()
{
int T;
scanf("%d", &T);
while(T -- )
{
scanf("%lf%lf%lf", &H, &h, &D);
double l = 0, r = D;
while(r-l >= 1e-6)
{
double mid1 = l + (r - l) / 3.0, mid2 = r - (r - l) / 3.0;//三分
if(check(mid1) > check(mid2)) r = mid2;
else l = mid1;
}
printf("%.3lf\n", check(r));
}
return 0;
}
参考博客