1 条题解

  • 0
    @ 2025-4-15 20:00:04

    题意分析

    题目描述了一个几何问题:给定一个大圆半径 R 和要放置的小圆数量 n,要求计算小圆半径 r 的最大可能值,使得 n 个小圆可以紧密排列在大圆的边界内侧,且小圆之间没有空隙。

    关键点:

    1. 小圆必须全部接触大圆的内边界
    2. 相邻小圆必须彼此相切
    3. 需要找到满足条件的最大小圆半径 r

    解题思路

    1. 几何关系建立

      • 将大圆中心 O 与每个小圆中心 C_i 连接,形成正 n 边形
      • 相邻小圆中心连线长度为 2r
      • 大圆半径 R = r + 小圆中心到大圆中心的距离
    2. 数学推导

      • 正 n 边形的中心角为 2π/n
      • 利用三角函数关系:sin(π/n) = r/(R-r)
      • 解得:r = R·sin(π/n) / (1 + sin(π/n))
    3. 算法选择

      • 直接应用推导出的公式计算
      • 注意使用高精度数学函数计算三角函数值
    4. 输入输出处理

      • 多组测试数据
      • 输出格式要求精确到小数点后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;
    }
    

    代码说明

    1. 输入处理

      • 读取测试用例数量 scenarios
      • 对于每个测试用例读取 R 和 n
    2. 数学计算

      • 使用 acos(-1.0) 精确计算 π
      • 计算中心角 angle = π/n
      • 应用推导公式计算 r
    3. 输出处理

      • 使用 fixed 和 setprecision(3) 保证输出3位小数
      • 每组输出后添加空行
    4. 注意事项

      • 使用 double 保证计算精度
      • 三角函数计算使用标准库函数
      • 输出格式严格符合题目要求

    该解法直接应用几何公式,时间复杂度为 O(1) 每测试用例,能够高效处理题目给定的数据范围。

    • 1

    信息

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