Solution - 楼梯

描述

一个街道两侧有两栋楼,现在有如图所示两楼梯 \(x\) , \(y\)。

两个楼梯分别如图放置。

已知两个楼梯的长度和他们交点离地面的高度,求两栋楼之间的距离。

Solution - 楼梯

简要题意: 如图,已知 \(AD\), \(CB\), \(GH\)。求 \(BD\) 的长。
Solution - 楼梯

题解

如果直接暴力算出 \(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;
}
上一篇:前端速成(10)css


下一篇:题解 P7885 「MCOI-06」Flight