1 条题解

  • 0
    @ 2025-4-9 22:11:16

    解题思路

    设街道宽度为d。根据相似三角形的原理,我们可以得到一个关于d的方程。假设从右侧梯子底部到交叉点的水平距离为a,从左侧梯子底部到交叉点的水平距离为b,则a+b=da + b = d。根据相似三角形的性质,对于右侧梯子有h1x=dad\frac{h_1}{x}=\frac{d - a}{d}h1h_1为右侧梯子顶端到交叉点的垂直距离),对于左侧梯子有h2y=dbd\frac{h_2}{y}=\frac{d - b}{d}h2h_2为左侧梯子顶端到交叉点的垂直距离),且h1+h2+ch_1 + h_2 + c分别是左右两侧楼的高度,同时ch1=ad\frac{c}{h_1}=\frac{a}{d}ch2=bd\frac{c}{h_2}=\frac{b}{d}。通过这些关系可以推导出一个复杂的方程,直接求解比较困难,所以可以使用二分查找的方法来逼近街道宽度d的值。

    代码

    #include <cmath>
    #include <iomanip>
    #include <iostream>
    using namespace std;
    
    double x, y, c;
    
    bool judge(double d) {
        double t1 = sqrt(x * x - d * d);
        double t2 = sqrt(y * y - d * d);
        if (t1 * t2 >= c * (t1 + t2)) {
            return true;
        } else {
            return false;
        }
    }
    
    int main() {
        while (cin >> x >> y >> c) {
            double l = 0, r = min(x, y), mid;
            int cnt = 99;
            while (cnt--) {
                mid = (l + r) / 2.0;
                if (judge(mid)) {
                    l = mid;
                } else {
                    r = mid;
                }
            }
            cout << fixed << setprecision(3) << mid << endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1508
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者