描述
一个街道两侧有两栋楼,现在有如图所示两楼梯 \(x\) , \(y\)。
两个楼梯分别如图放置。
已知两个楼梯的长度和他们交点离地面的高度,求两栋楼之间的距离。
简要题意: 如图,已知 \(AD\), \(CB\), \(GH\)。求 \(BD\) 的长。
题解
如果直接暴力算出 \(BD\) 的话好像有些困难,那么我们就萌生出二分的想法。
然后我们可以证明出 \(GH=\frac{AB×CD}{AB+CD}\)
观察这个式子 \(GH\) 随着 \(BD\) 的增大而减小,所以是具有单调性的,可以进行二分答案。
证明过程
设 $AD=a$ , $BC=b$, $GH=c$, $AB=x$, $CD=y$, $BD=s$由勾股定理,我们有:
\( \begin{cases}x=\sqrt{a^2-s^2} \\y=\sqrt{b^2-s^2} \end{cases} \)
易证 \(\triangle ABD \sim \triangle GHD\)
\(\therefore \frac{c}{x}=\frac{HD}{s} \to HD=\frac{sc}{x}\)
同理可得
\(\frac{c}{y}=\frac{BH}{s} \to BH=\frac{sc}{y}\)
又 \(\because HD+BH=s\)
\(\therefore \frac{sc}{x}+\frac{sc}{y}=s\)
整理得 \(c=\frac{xy}{x+y}\)
(证毕)
\(code\)
#include <bits/stdc++.h>
using namespace std;
double a, b, c;
bool check(double s) {
double x = sqrt(a * a - s * s);
double y = sqrt(b * b - s * s);
return x * y / (x + y) > c;
}
int main() {
scanf("%lf %lf %lf", &a, &b, &c);
double l = 0, r = 2500.0;
while (r - l > 0.0001) {
double mid = (l + r) / 2.0;
if (check(mid))
l = mid;
else
r = mid;
}
printf("%.3lf", l);
return 0;
}