9.9华为OD机试真题 新系统 – 受限任务分配 (JavaPyCC++JsGo)
2026 华为OD机试真题 4月15日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
某部门有一批待处理任务,数量为 x;系统按轮次处理任务,每次平分后只保留其中一组进入下一轮,当 x=1 时,处理结束,不再执行任何操作。
每一轮按照以下规则处理:
-
当 x 为偶数时,执行一次平分操作:
- 任务数变为 x/2,消耗 1 点成本,操作次数增加 1。
-
当 x 为奇数时,先按如下选择调整任务数为偶数,然后再执行一次平分操作:
- 新增 1 次任务:任务数变为 x+1,消耗 add_cost 点成本,操作次数增加 1;
- 减少 1 次任务:任务数变为 x−1,消耗 return_cost 点成本,操作次数增加 1。
当给定一组 new_tasks,请找出平分任务至 1 时,总成本消耗最少的方案;若达到最低总成本的方案有多种,选择其中操作次数最少的方案。
2026 华为OD机试真题 4月15日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
输入描述
-
new_tasks:当前任务数,1≤new_tasks≤10000
-
budget:成本预算上限,1≤budget≤50
-
add_cost:获取 1 个任务的成本,1≤add_cost≤10
-
return_cost:回收 1 个任务的成本,1≤return_cost≤10
输出描述
输出 [最低总成本, 最少操作次数],如果最低总成本超过 budget,输出 [-1,-1];如果输入任务数为 1,直接输出 [0,0]。
示例1
输入
5,5,2,1
输出
[3,3]
说明
- 5→4:选择回收任务,成本 1,操作次数 1
- 4→2:平分,成本 1,操作次数 1
- 2→1:平分,成本 1,操作次数 1
总成本为 3,操作次数为 3,未超过预算 5。
示例2
输入
5,2,1,3
输出
[-1,-1]
说明
- 选择获取任务:5→6→3,累计成本为 2,操作次数为 2。此时预算已经用完,但任务数仍为 3,后续任何操作都会超出预算。
- 选择回收任务:仅 5→4 就需要成本 3,已经超过预算。因此无法完成。
示例3
输入
7,30,2,10
输出
[5,4]
说明
- 7→8:选择获取任务,成本 2,操作次数 1
- 8→4:平分,成本 1,操作次数 1
- 4→2:平分,成本 1,操作次数 1
- 2→1:平分,成本 1,操作次数 1
总成本为 5,操作次数为 4。
虽然先回收任务也可以使任务数变为偶数,但回收成本较高,不是最低成本方案。
解题思路
核心思想
设 dp[i] 表示从 i 个任务处理到 1 个任务时的最优结果,结果包含两个维度:最低成本和在最低成本下的最少操作次数。
由于 i > 1 时,下一轮任务数只会变成 i/2、(i+1)/2 或 (i-1)/2,这些状态都小于 i。因此可以从 1 开始线性递推到 new_tasks,避免递归搜索和记忆化哈希表。
算法步骤
- 初始化
dp[1] = (0, 0)。 - 从
2到new_tasks枚举任务数i。 - 如果
i为偶数,只能执行平分操作,由dp[i/2]转移而来,成本和操作次数各加1。 - 如果
i为奇数,可以先新增任务再平分,转移到(i+1)/2;也可以先减少任务再平分,转移到(i-1)/2。 - 两个候选方案先比较总成本,成本相同再比较操作次数。
- 得到
dp[new_tasks]后,如果最低成本超过budget,输出[-1,-1],否则输出最优结果。
复杂度分析
- 时间复杂度:
O(new_tasks),每个任务数只计算一次。 - 空间复杂度:
O(new_tasks),保存从1到new_tasks的最