1 条题解
-
0
问题分析*
本题的核心是计算一个矩形容器在装有特定体积的液体时,能倾斜的最大角度,同时确保液体不会溢出。为了实现这一目标,我们需要理解几何特性,并基于三角函数进行计算。
基本条件
-
容器的底面是一个边长为 的正方形,即底面积:
$$S_{\text{base}} = 25 \times 25 = 625~\mathrm{cm}^2 $$ -
容器的高度是 ,因此总容积:
$$V_{\text{total}} = 625 \times 33 = 20625~\mathrm{cm}^3 $$ -
液体体积:。
dash 将容器沿着底面的一条边缓慢倾斜,我们的目标是计算最大倾斜角,即使得液体刚好到达容器边界但不溢出的最大角度。
解法思路
当容器倾斜时,液体表面可能形成两种不同的几何形状:
- 三角形情况:如果液体体积较小,表面呈三角形。
- 梯形情况:如果液体体积较大,表面呈梯形。
判断依据: 假设不倾斜时液体的高度为:
$$h = \frac{V}{S_{\text{base}}} = \frac{2025}{625} = 3.24~\mathrm{cm} $$- 如果液体高度小于容器高度的一半,那么倾斜后,液体表面是一个直角三角形。
- 如果液体高度超过一半,那么倾斜后,液体表面是一个梯形。
数学推导
1. 三角形情况
当液体表面是三角形时,倾斜角度 满足:
其中:
- 底边:
- 高:(容器的高度)
因此:
$$\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
- 上传者