1 条题解
-
0
题意分析
题目描述托尼飞船和母船在恒星爆炸后的运动情况。托尼需要尽快回到母船,同时保持与母船到爆炸点的距离相同。关键条件如下:
-
初始几何关系:
- 托尼飞船(T)、爆炸点(O)和母船(M)构成等腰三角形
- OT = OM = d(当前到爆炸点的距离)
- ∠TOM = a(给定角度)
-
运动特性:
- 母船以速度u沿OM方向远离爆炸点(仅径向运动)
- 托尼飞船速度为2u,可调整方向
- 两者必须始终保持到爆炸点的距离相同
-
解决方案:
- 托尼飞船运动策略:径向速度分量保持u(匹配母船),切向速度分量为√3u
- 随时间变化,两者距爆炸点距离增加,但角度差减小
- 所需时间t由公式计算:
t = (d/u) * [exp(a_rad/√3) - 1]
a_rad
:角度a的弧度值exp()
:自然指数函数
解题思路
-
几何关系转换:
- 将输入角度a从度转换为弧度
- 使用公式:
a_rad = a * π / 180
-
时间计算:
- 使用公式:
t = (d/u) * (exp(a_rad/√3) - 1)
- 该公式源自角距离变化的微分方程求解
- 使用公式:
-
输出处理:
- 若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; }
代码解释
-
常量定义:
PI
:通过acos(-1.0)
计算π值sqrt3
:预先计算√3的值避免重复计算
-
输入处理:
- 循环读取多组测试数据(u, a, d)
- 遇到(0, 0, 0)时终止程序
-
角度转换:
a_rad = a_deg * PI / 180.0
将角度转换为弧度
-
时间计算:
- 计算指数项:
exponent = a_rad / sqrt3
- 计算指数函数值:
exp_val = exp(exponent)
- 套用公式:
t = (d/u) * (exp_val - 1)
- 计算指数项:
-
输出控制:
- 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
- 上传者