1 条题解

  • 0
    @ 2025-4-7 19:57:53

    题意分析

    题目描述托尼飞船和母船在恒星爆炸后的运动情况。托尼需要尽快回到母船,同时保持与母船到爆炸点的距离相同。关键条件如下:

    1. 初始几何关系

      • 托尼飞船(T)、爆炸点(O)和母船(M)构成等腰三角形
      • OT = OM = d(当前到爆炸点的距离)
      • ∠TOM = a(给定角度)
    2. 运动特性

      • 母船以速度u沿OM方向远离爆炸点(仅径向运动)
      • 托尼飞船速度为2u,可调整方向
      • 两者必须始终保持到爆炸点的距离相同
    3. 解决方案

      • 托尼飞船运动策略:径向速度分量保持u(匹配母船),切向速度分量为√3u
      • 随时间变化,两者距爆炸点距离增加,但角度差减小
      • 所需时间t由公式计算:t = (d/u) * [exp(a_rad/√3) - 1]
        • a_rad:角度a的弧度值
        • exp():自然指数函数

    解题思路

    1. 几何关系转换

      • 将输入角度a从度转换为弧度
      • 使用公式:a_rad = a * π / 180
    2. 时间计算

      • 使用公式:t = (d/u) * (exp(a_rad/√3) - 1)
      • 该公式源自角距离变化的微分方程求解
    3. 输出处理

      • 若t > 10000秒,输出"God help me!"
      • 否则输出t四舍五入到最接近的整数

    C++代码实现

    #include <iostream>
    #include <cmath>
    #include <iomanip>
    using namespace std;
    
    int main() {
        // 定义π值
        const double PI = acos(-1.0);
        // 定义√3值
        const double sqrt3 = sqrt(3.0);
        
        double u, a_deg, d;
        while (cin >> u >> a_deg >> d) {
            // 结束条件判断
            if (u == 0 && a_deg == 0 && d == 0) break;
            
            // 角度转弧度
            double a_rad = a_deg * PI / 180.0;
            
            // 计算关键参数
            double exponent = a_rad / sqrt3;
            double exp_val = exp(exponent);
            
            // 计算时间
            double t = (d / u) * (exp_val - 1);
            
            // 输出结果
            if (t > 10000) {
                cout << "God help me!" << endl;
            } else {
                // 四舍五入到最接近的整数
                cout << (int)(t + 0.5) << endl;
            }
        }
        return 0;
    }
    

    代码解释

    1. 常量定义

      • PI:通过acos(-1.0)计算π值
      • sqrt3:预先计算√3的值避免重复计算
    2. 输入处理

      • 循环读取多组测试数据(u, a, d)
      • 遇到(0, 0, 0)时终止程序
    3. 角度转换

      • a_rad = a_deg * PI / 180.0 将角度转换为弧度
    4. 时间计算

      • 计算指数项:exponent = a_rad / sqrt3
      • 计算指数函数值:exp_val = exp(exponent)
      • 套用公式:t = (d/u) * (exp_val - 1)
    5. 输出控制

      • t > 10000时输出"God help me!"
      • 否则使用(int)(t + 0.5)实现四舍五入

    示例验证

    输入:1 57 10

    • 计算过程:
      • a_rad = 57 * π / 180 ≈ 0.9948
      • exponent = 0.9948 / √3 ≈ 0.574
      • exp_val ≈ e^0.574 ≈ 1.775
      • t = (10/1) * (1.775-1) = 7.75
    • 四舍五入结果:8

    输入:2 114 999999

    • a_rad = 114 * π / 180 ≈ 1.9897
    • exponent = 1.9897 / √3 ≈ 1.148
    • exp_val ≈ e^1.148 ≈ 3.154
    • t = (999999/2) * (3.154-1) ≈ 1076998 > 10000
    • 输出"God help me!"

    复杂度分析

    • 时间复杂度:O(1) 每个测试用例固定计算
    • 空间复杂度:O(1) 仅使用固定数量变量

    该方案精确满足题目要求,正确处理边界情况,并通过数学建模解决了运动约束问题。

    • 1

    信息

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