#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号发动机的初始燃料总量为 MM 升。 发动机在 1% 推力下,每秒消耗的燃料为 KK。 (例如:如果当前推力是 50%,则每秒消耗 50×K50 \times K 升燃料)。

现在给出一个包含 NN 个指令的测试序列,第 ii 个指令包含两个整数 PiP_iTiT_i

  • PiP_i:表示该阶段的推力百分比(1Pi1001 \le P_i \le 100)。
  • TiT_i:表示该阶段持续的时间(单位:秒)。

请你计算:

  1. 发动机能否完整执行完这 NN 个指令而燃料不耗尽?
  2. 如果能执行完,输出测试结束后的 剩余燃料
  3. 如果中途燃料耗尽(燃料变负或归零的那一刻),测试立即停止,请输出发动机 总共成功运行了多少秒(燃料耗尽的那一秒不算完整运行,不计入或根据具体逻辑截断,本题约定:只要当前这一秒所需的燃料不够了,这一秒就不算成功)。

【输入格式】

第一行包含三个正整数 N,M,KN, M, K,分别表示指令数量、初始燃料总量、1%推力下的单位消耗率。 接下来 NN 行,每行两个整数 Pi,TiP_i, T_i,表示第 ii 个指令的推力百分比和持续时间。

【输出格式】

如果测试成功,输出一行字符串 Success,并在下一行输出剩余燃料量。 如果测试失败(燃料耗尽),输出一行字符串 Fail,并在下一行输出总共成功运行的秒数。

样例输入 1:

3 1200 1
50 10
80 5
100 2

样例输出 1:

Success
100

👨‍🏫 教练的思路提示(Heuristic Teaching)

1. 预备知识点总结

要解决这道题,你需要掌握:

  • 变量类型:燃料 MM 可能很大,虽然GESP 4级通常 int 够用,但要考虑是否会溢出(本题 long long 更安全,但 int 也可以)。
  • 循环结构for 循环遍历指令,或者嵌套循环模拟每一秒。
  • 条件判断if 语句判断燃料是否足够。
  • 累加器:用于统计总运行时间。

2. 草稿纸上的推理(Thinking Process)

同学,拿起笔,我们画个图来理解这个过程。想象猛禽发动机有一个油箱。

第一步:读懂消耗公式

  • 关键公式:每秒消耗 = 推力百分比 PP ×\times 系数 KK
  • 不要被物理名词吓到,这就是个乘法。

第二步:模拟策略选择(这是关键!) 我们有两种模拟方法:

  • 方法A:按“秒”模拟(暴力法)
    • 滴答、滴答……一秒一秒地扣除燃料。
    • 优点:逻辑简单,容易计算具体的“失败时间点”。
    • 缺点:如果时间 TiT_i 很大(比如1亿秒),循环次数太多,会超时(Time Limit Exceeded)。
  • 方法B:按“阶段”模拟(数学法)
    • 直接计算这一个指令阶段的总消耗:Cost=Pi×K×TiCost = P_i \times K \times T_i
    • 如果 MCostM \ge Cost,直接扣除,时间加上 TiT_i,进入下一阶段。
    • 如果 M<CostM < Cost,说明会在这个阶段中间停下来。这时候需要用除法计算剩下的油还能撑几秒。

对于GESP 4级,虽然数据量通常不大(N100,Ti1000N \le 100, T_i \le 1000),方法A没问题,但教练推荐你尝试方法B,因为这更像金牌选手的思维!

第三步:图解流程(以样例2为例)

当前状态 剩余燃料 (M=500) 当前指令 每秒消耗 (P×KP \times K) 需要消耗 判定
阶段 1 500 50%, 4s 50×2=10050 \times 2 = 100 100×4=400100 \times 4 = 400 够!(500 > 400)
更新 500400=100500 - 400 = 100 (已运行4s)
阶段 2 100 100%, 5s 100×2=200100 \times 2 = 200 200×5=1000200 \times 5 = 1000 不够!

第四步:处理“不够”的情况 在阶段2,我们剩100油,每秒耗200。

  • 能跑1秒吗? 需要200,我有100 \to 不够。
  • 所以这个阶段运行了 0 秒。
  • 总时间 = 阶段1的时间 (4) + 阶段2跑的时间 (0) = 4秒。
  • 注意:如果是剩300油,每秒耗200,能跑几秒? 300/200=1300 / 200 = 1 秒。 \rightarrow 这里用到了整数除法

3. 复杂度分析与优化

  • 时间复杂度
    • 如果你用“按秒模拟”(两层循环),复杂度是 O(Ti)O(\sum T_i)。如果总时间是 400秒,没问题;如果是 10910^9 秒,电脑会“死机”。
    • 如果你用“按阶段模拟”(一层循环),复杂度是 O(N)O(N)。因为 NN 只有100左右,这对计算机来说是瞬间完成的。这是最优解。
  • 空间复杂度
    • 只需要几个变量存储 M,K,P,TM, K, P, T,或者开一个数组存指令,是 O(N)O(N)O(1)O(1)

4. 读题关键词(Key Points)

做这类OI题目,眼睛要像鹰一样抓住这些词:

  1. “依次” \rightarrow 暗示需要按顺序遍历数组或输入。
  2. “每秒消耗” \rightarrow 暗示这是速率,总消耗 = 速率 ×\times 时间。
  3. “耗尽的一刻立即停止” \rightarrow 边界条件!一旦燃料不足以支持下一秒,循环break
  4. 数据范围 \rightarrow 看到 N,MN, M 的大小。如果 MM101810^{18},必须用 long long;如果 TiT_i 很大,必须用数学乘法而不是循环减法。

🚀 动手试试吧!

请在草稿纸上写出你的伪代码。 提示:

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的工程师一样解决这个计算问题!