1 条题解
-
0
题意分析
题目描述了一个几何问题:给定一个大圆半径 R 和要放置的小圆数量 n,要求计算小圆半径 r 的最大可能值,使得 n 个小圆可以紧密排列在大圆的边界内侧,且小圆之间没有空隙。
关键点:
- 小圆必须全部接触大圆的内边界
- 相邻小圆必须彼此相切
- 需要找到满足条件的最大小圆半径 r
解题思路
-
几何关系建立:
- 将大圆中心 O 与每个小圆中心 C_i 连接,形成正 n 边形
- 相邻小圆中心连线长度为 2r
- 大圆半径 R = r + 小圆中心到大圆中心的距离
-
数学推导:
- 正 n 边形的中心角为 2π/n
- 利用三角函数关系:sin(π/n) = r/(R-r)
- 解得:r = R·sin(π/n) / (1 + sin(π/n))
-
算法选择:
- 直接应用推导出的公式计算
- 注意使用高精度数学函数计算三角函数值
-
输入输出处理:
- 多组测试数据
- 输出格式要求精确到小数点后3位
- 每组输出后有空行
标程实现
#include <iostream> #include <iomanip> #include <cmath> using namespace std; int main() { int scenarios; cin >> scenarios; const double PI = acos(-1.0); // 精确计算π值 for (int scenario = 1; scenario <= scenarios; ++scenario) { double R; int n; cin >> R >> n; double angle = PI / n; // 计算中心角的一半 double sin_val = sin(angle); double r = (R * sin_val) / (1 + sin_val); // 格式化输出 cout << "Scenario #" << scenario << ":\n" << fixed << setprecision(3) << r << "\n\n"; } return 0; }
代码说明
-
输入处理:
- 读取测试用例数量 scenarios
- 对于每个测试用例读取 R 和 n
-
数学计算:
- 使用 acos(-1.0) 精确计算 π
- 计算中心角 angle = π/n
- 应用推导公式计算 r
-
输出处理:
- 使用 fixed 和 setprecision(3) 保证输出3位小数
- 每组输出后添加空行
-
注意事项:
- 使用 double 保证计算精度
- 三角函数计算使用标准库函数
- 输出格式严格符合题目要求
该解法直接应用几何公式,时间复杂度为 O(1) 每测试用例,能够高效处理题目给定的数据范围。
- 1
信息
- ID
- 800
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者