1 条题解

  • 0
    @ 2025-3-10 22:01:36

    问题分析*

    本题的核心是计算一个矩形容器在装有特定体积的液体时,能倾斜的最大角度,同时确保液体不会溢出。为了实现这一目标,我们需要理解几何特性,并基于三角函数进行计算。

    基本条件

    • 容器的底面是一个边长为 25 cm25~\mathrm{cm} 的正方形,即底面积:

      $$S_{\text{base}} = 25 \times 25 = 625~\mathrm{cm}^2 $$
    • 容器的高度33 cm33~\mathrm{cm},因此总容积:

      $$V_{\text{total}} = 625 \times 33 = 20625~\mathrm{cm}^3 $$
    • 液体体积V=2025 cm3V = 2025~\mathrm{cm}^3

    dash 将容器沿着底面的一条边缓慢倾斜,我们的目标是计算最大倾斜角,即使得液体刚好到达容器边界但不溢出的最大角度。

    解法思路

    当容器倾斜时,液体表面可能形成两种不同的几何形状

    1. 三角形情况:如果液体体积较小,表面呈三角形。
    2. 梯形情况:如果液体体积较大,表面呈梯形。

    判断依据: 假设不倾斜时液体的高度为:

    $$h = \frac{V}{S_{\text{base}}} = \frac{2025}{625} = 3.24~\mathrm{cm} $$
    • 如果液体高度小于容器高度的一半,那么倾斜后,液体表面是一个直角三角形
    • 如果液体高度超过一半,那么倾斜后,液体表面是一个梯形

    数学推导

    1. 三角形情况

    当液体表面是三角形时,倾斜角度 θ\theta 满足:

    tanθ=底边\tan \theta = \frac{\text{底边}}{\text{高}}

    其中:

    • 底边b=2VSbaseb = \frac{2V}{S_{\text{base}}}
    • HH(容器的高度)

    因此:

    $$\theta = 90^\circ - \tan^{-1} \left( \frac{b}{H} \right) $$

    2. 梯形情况

    如果液体高度更大,它会形成梯形。倾斜时,我们可以用另一种计算方法

    $$\theta = 90^\circ - \tan^{-1} \left( \frac{\text{容器宽度}}{\text{新液面高度}} \right) $$

    其中新液面高度可以从几何关系推导出来。

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0);
    
        const double PI = acos(-1);
        double a, b, x;
        cin >> a >> b >> x;
    
        x /= a; // 计算液体的面积
        double st = x * 2 / a - b; // 计算梯形的上底
    
        if (st > 0) { // 液体形成梯形
            cout << fixed << setprecision(3) << 90.0 - atan(a / (b - st)) * 180.0 / PI;
        } else { // 液体形成三角形
            a = 2 * x / b;
            cout << fixed << setprecision(3) << 90.0 - atan(a / b) * 180.0 / PI;
        }
    
        return 0;
    }
    
    import java.util.Scanner;
    
    public class TiltAngle {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            double a = scanner.nextDouble();
            double b = scanner.nextDouble();
            double x = scanner.nextDouble();
            scanner.close();
    
            final double PI = Math.acos(-1);
            x /= a;  // 计算液体面积
            double st = x * 2 / a - b; // 计算梯形上底
    
            double angle;
            if (st > 0) { // 液体表面为梯形
                angle = 90.0 - Math.toDegrees(Math.atan(a / (b - st)));
            } else { // 液体表面为三角形
                a = 2 * x / b;
                angle = 90.0 - Math.toDegrees(Math.atan(a / b));
            }
    
            System.out.printf("%.3f\n", angle);
        }
    }
    
    import math
    
    def max_tilt_angle(a, b, x):
        PI = math.acos(-1)
        x /= a  # 计算液体面积
        st = x * 2 / a - b  # 计算梯形的上底
    
        if st > 0:  # 液体形成梯形
            angle = 90.0 - math.degrees(math.atan(a / (b - st)))
        else:  # 液体形成三角形
            a = 2 * x / b
            angle = 90.0 - math.degrees(math.atan(a / b))
    
        return angle
    
    # 读取输入
    a, b, x = map(float, input().split())
    print(f"{max_tilt_angle(a, b, x):.3f}")
    

    信息

    ID
    294
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    150
    已通过
    11
    上传者