#19342. 猛禽发动机长程点火测试
猛禽发动机长程点火测试
先看视频: https://mp.weixin.qq.com/s/IRHu8iFaNjcUOopTHlnEAw
你好!我是你的OI金牌教练。看到SpaceX猛禽3号(Raptor 3)那个令人震撼的400秒长程点火测试了吗?这简直是工程学的奇迹!
- 推力达到 280吨
- 在超高温与极端压力下仍保持稳定
- 冷却系统和材料强度达到顶级

3代发动机的外形像不像我们的代码越来越精简和强大?
在信息学奥赛中,模拟(Simulation) 是非常经典且基础的题型。结合猛禽3号“长时间点火”和“燃料消耗”的背景,我为你设计了一道符合 GESP 4级 难度的题目。
GESP 4级通常考察:多重循环、一维数组、字符串处理、基本算法(如找最值、简单排序、模拟)。
题目名称:猛禽之火:长程点火测试 (Raptor Test Simulation)
【题目背景】
根据最新消息,SpaceX的第三代猛禽发动机(Raptor 3)完成了长达400秒的点火测试。为了确保发动机在极端工况下的稳定性,工程师们制定了一套复杂的“变推力测试计划”。 发动机需要按照预定的指令序列运行,每个指令包含“目标推力百分比”和“持续时间”。推力越大,燃料消耗越快。
【题目描述】
你作为SpaceX的首席软件工程师,需要编写一个程序来模拟猛禽3号的测试过程。
已知猛禽3号发动机的初始燃料总量为 升。 发动机在 1% 推力下,每秒消耗的燃料为 升。 (例如:如果当前推力是 50%,则每秒消耗 升燃料)。
现在给出一个包含 个指令的测试序列,第 个指令包含两个整数 和 :
- :表示该阶段的推力百分比()。
- :表示该阶段持续的时间(单位:秒)。
请你计算:
- 发动机能否完整执行完这 个指令而燃料不耗尽?
- 如果能执行完,输出测试结束后的 剩余燃料;
- 如果中途燃料耗尽(燃料变负或归零的那一刻),测试立即停止,请输出发动机 总共成功运行了多少秒(燃料耗尽的那一秒不算完整运行,不计入或根据具体逻辑截断,本题约定:只要当前这一秒所需的燃料不够了,这一秒就不算成功)。
【输入格式】
第一行包含三个正整数 ,分别表示指令数量、初始燃料总量、1%推力下的单位消耗率。 接下来 行,每行两个整数 ,表示第 个指令的推力百分比和持续时间。
【输出格式】
如果测试成功,输出一行字符串 Success,并在下一行输出剩余燃料量。
如果测试失败(燃料耗尽),输出一行字符串 Fail,并在下一行输出总共成功运行的秒数。
样例输入 1:
3 1200 1
50 10
80 5
100 2
样例输出 1:
Success
100
👨🏫 教练的思路提示(Heuristic Teaching)
1. 预备知识点总结
要解决这道题,你需要掌握:
- 变量类型:燃料 可能很大,虽然GESP 4级通常
int够用,但要考虑是否会溢出(本题long long更安全,但int也可以)。 - 循环结构:
for循环遍历指令,或者嵌套循环模拟每一秒。 - 条件判断:
if语句判断燃料是否足够。 - 累加器:用于统计总运行时间。
2. 草稿纸上的推理(Thinking Process)
同学,拿起笔,我们画个图来理解这个过程。想象猛禽发动机有一个油箱。
第一步:读懂消耗公式
- 关键公式:每秒消耗 = 推力百分比 系数
- 不要被物理名词吓到,这就是个乘法。
第二步:模拟策略选择(这是关键!) 我们有两种模拟方法:
- 方法A:按“秒”模拟(暴力法)
- 滴答、滴答……一秒一秒地扣除燃料。
- 优点:逻辑简单,容易计算具体的“失败时间点”。
- 缺点:如果时间 很大(比如1亿秒),循环次数太多,会超时(Time Limit Exceeded)。
- 方法B:按“阶段”模拟(数学法)
- 直接计算这一个指令阶段的总消耗:。
- 如果 ,直接扣除,时间加上 ,进入下一阶段。
- 如果 ,说明会在这个阶段中间停下来。这时候需要用除法计算剩下的油还能撑几秒。
对于GESP 4级,虽然数据量通常不大(),方法A没问题,但教练推荐你尝试方法B,因为这更像金牌选手的思维!
第三步:图解流程(以样例2为例)
| 当前状态 | 剩余燃料 (M=500) | 当前指令 | 每秒消耗 () | 需要消耗 | 判定 |
|---|---|---|---|---|---|
| 阶段 1 | 500 | 50%, 4s | 够!(500 > 400) | ||
| 更新 | (已运行4s) | ||||
| 阶段 2 | 100 | 100%, 5s | 不够! | ||
第四步:处理“不够”的情况 在阶段2,我们剩100油,每秒耗200。
- 能跑1秒吗? 需要200,我有100 不够。
- 所以这个阶段运行了 0 秒。
- 总时间 = 阶段1的时间 (4) + 阶段2跑的时间 (0) = 4秒。
- 注意:如果是剩300油,每秒耗200,能跑几秒? 秒。 这里用到了整数除法。
3. 复杂度分析与优化
- 时间复杂度:
- 如果你用“按秒模拟”(两层循环),复杂度是 。如果总时间是 400秒,没问题;如果是 秒,电脑会“死机”。
- 如果你用“按阶段模拟”(一层循环),复杂度是 。因为 只有100左右,这对计算机来说是瞬间完成的。这是最优解。
- 空间复杂度:
- 只需要几个变量存储 ,或者开一个数组存指令,是 或 。
4. 读题关键词(Key Points)
做这类OI题目,眼睛要像鹰一样抓住这些词:
- “依次” 暗示需要按顺序遍历数组或输入。
- “每秒消耗” 暗示这是速率,总消耗 = 速率 时间。
- “耗尽的一刻立即停止” 边界条件!一旦燃料不足以支持下一秒,循环
break。 - 数据范围 看到 的大小。如果 是 ,必须用
long long;如果 很大,必须用数学乘法而不是循环减法。
🚀 动手试试吧!
请在草稿纸上写出你的伪代码。 提示:
long long current_fuel = M;
long long total_time = 0;
bool is_success = true;
for (int i = 0; i < N; i++) {
// 1. 计算当前阶段单位时间的消耗 rate
// 2. 计算当前阶段总需求 need = rate * t[i]
// 3. 判断 current_fuel 是否大于等于 need
// - 如果够:扣油,加时间
// - 如果不够:算还能跑几秒 (current_fuel / rate),加时间,标记失败,break
}
// 4. 根据 is_success 输出结果
加油!你可以像SpaceX的工程师一样解决这个计算问题!