华为OD机试 - 高效的任务规划(Python/JS/C/C++ 双机位A卷 200分)

一、题目描述

你有 n 台机器,编号为 1~n,每台都需要完成一项工作,机器经过配置后都能完成独 立完成一项工作。

假设第 i 台机器你需要花 B 分钟进行设置,然后开始运行,J 分钟后完成任务。

现在,你需要选择布置工作的顺序,使得用最短的时间完成所有工作。

注意,不能同时对两台进行配置,但配置完成的机器们可以同时执行他们各自的工作。

二、输入描述

第一行输入代表总共有 M 组任务数据 (1<M<=10)。

每组数第一行为一个整数指定机器的数量 N (0<N<=1000)。

随后的 N 行每行两个整数,第一个表示 B (0<=B<=10000),第二个表示 J (0<=J<=10000)

每组数据连续输入,不会用空行分隔。各组任务单独计时。

三、输出描述

对于每组任务,输出最短完成时间,且每组的结果独占一行。

四、测试用例

测试用例1:

1、输入

2
2
3 2
2 3
1
5 5

2、输出

7
10

3、说明

第一组:
排序后顺序:(2,3), (3,2)
设置时间累加

<think>嗯,用户正在查找华为OD机位A中关于"流浪地球"目的资料。从引用内容看,这道出现在机位A库中,引用[4]明确提到了目背景和部规则。 用户需要完整的目描述和解答方案。根据引用[4]的关键信息:目设定是在赤道上部署N个环形排列的转向发动,编号0到N-1。核心制是发动启动的连锁反应——手动启动一个发动会在下个时刻触发相邻两个发动的"关联启动"。 考虑到用户可能需要编程实现,准备用Python/Java/C++三种主流语言写解答。解关键在于发现启动规律本质是斐波那契数列的变种:当手动启动第k号发动时,最终启动的发动总数满足递推关系f(k)=f(k-1)+f(k-2),需要特殊处理环形边界条件。 关于目难度,从引用[3]提到的机位A包含新旧型来看,这道应该是中等难度的动态规划,涉及环形数组和状态转移。用户可能需要补充前置知识如:环形数组索引处理技巧(取模运算)、动态规划的空间优化(只存储前两个状态)。 注意到引用[1][2][3]都强调机位A备考要掌握基础数据结构和算法,特别是动态规划。因此解答中会突出算法设计思路,并在相关问里延伸备考建议。 </think> 根据引用[4]提供的目背景和规则,以下是针对华为OD机位A**"流浪地球"发动启动问**的完整解析与解答: --- ### **目描述** **背景** 在赤道上均匀部署 `N` 个环形排列的转向发动(编号 `0` 至 `N-1`),所有发动初始为**未启动状态**。 **启动规则**: 1. 启动方式为**手动启动**和**关联启动**; 2. 若时刻 `t` 手动启动某个发动,则时刻 `t+1` 其**左右相邻**的两个发动会被**关联启动**(发动 `0` 和 `N-1` 相邻,形成环形); 3. 若某发动已被启动,则重复启动无效。 **问** 求**只手动启动发动 `k`** 时,**最终所有被启动的发动数量**(含手动启动的发动)。 --- ### **解思路** 1. **关键观察**: - 启动过程是**链式反应**:手动启动 `k` 后,下一时刻启动 `(k-1)` 和 `(k+1)`,再下一时刻启动更外侧的发动,形成**对称扩散**。 - **环形结构**:发动 `0` 与 `N-1` 相邻,需特殊处理边界。 2. **数学建模**: 设 `f(x)` 表示从某点开始单侧连续启动的发动数(不含起点),满足递推关系: $$f(x) = f(x-1) + f(x-2) + 1 \quad \text{(x > 1)}$$ 其中 `f(0)=0`, `f(1)=1`。此递推本质是**斐波那契数列变种**。 3. **环形处理**: - 将环形展开为直线,手动启动 `k` 后,链式反应向**左右两侧传播**; - 当两侧的启动波在环形对面相遇时,**停止传播**(防止重复计数)。 4. **最终公式**: $$ \text{总启动数} = f(L) + f(R) + 1 $$ - `L`:从 `k` 向左传播到边界的距离; - `R`:从 `k` 向右传播到边界的距离; - `+1`:手动启动的发动 `k` 本身。 --- ### **代码实现** #### Python 解法 ```python def fibonacci_like(n): a, b = 0, 1 for _ in range(n): a, b = b, a + b + 1 return a def count_activated_engines(N, k): left_dist = k # 向左传播距离 right_dist = N - k - 1 # 向右传播距离 return fibonacci_like(left_dist) + fibonacci_like(right_dist) + 1 # 示例测 print(count_activated_engines(5, 2)) # 输出:5(启动发动2后共启动5个) ``` #### Java 解法 ```java public class Main { public static int fibonacciLike(int n) { if (n == 0) return 0; int a = 0, b = 1; for (int i = 2; i <= n; i++) { int next = a + b + 1; a = b; b = next; } return b; } public static int countActivatedEngines(int N, int k) { int leftDist = k; int rightDist = N - k - 1; return fibonacciLike(leftDist) + fibonacciLike(rightDist) + 1; } public static void main(String[] args) { System.out.println(countActivatedEngines(5, 2)); // 输出:5 } } ``` #### C++ 解法 ```cpp #include <iostream> using namespace std; int fibonacciLike(int n) { if (n == 0) return 0; int a = 0, b = 1; for (int i = 2; i <= n; ++i) { int next = a + b + 1; a = b; b = next; } return b; } int countActivatedEngines(int N, int k) { int leftDist = k; int rightDist = N - k - 1; return fibonacciLike(leftDist) + fibonacciLike(rightDist) + 1; } int main() { cout << countActivatedEngines(5, 2); // 输出:5 return 0; } ``` --- ### **复杂度析** - **时间复杂度**:$O(N)$,计算 `f(x)` 需遍历距离 `L` 和 `R`。 - **空间复杂度**:$O(1)$,仅用常数变量存储中间值[^4]。 --- ### **关键考点总结** 1. **环形数组处理**:通过 `left_dist` 和 `right_dist` 模拟环形传播; 2. **动态规划/递推**:斐波那契变种数列的快速计算; 3. **边界条件**:发动 `0` 与 `N-1` 的相邻关系[^3][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值