9.9华为OD机试真题 新系统 – 受限任务分配 (JavaPyCC++JsGo)

2026 华为OD机试真题 4月15日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

某部门有一批待处理任务,数量为 x;系统按轮次处理任务,每次平分后只保留其中一组进入下一轮,当 x=1 时,处理结束,不再执行任何操作。

每一轮按照以下规则处理:

  1. 当 x 为偶数时,执行一次平分操作:

    • 任务数变为 x/2,消耗 1 点成本,操作次数增加 1。
  2. 当 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,避免递归搜索和记忆化哈希表。

算法步骤

  1. 初始化 dp[1] = (0, 0)。
  2. 从 2 到 new_tasks 枚举任务数 i。
  3. 如果 i 为偶数,只能执行平分操作,由 dp[i/2] 转移而来,成本和操作次数各加 1。
  4. 如果 i 为奇数,可以先新增任务再平分,转移到 (i+1)/2;也可以先减少任务再平分,转移到 (i-1)/2。
  5. 两个候选方案先比较总成本,成本相同再比较操作次数。
  6. 得到 dp[new_tasks] 后,如果最低成本超过 budget,输出 [-1,-1],否则输出最优结果。

复杂度分析

  • 时间复杂度:O(new_tasks),每个任务数只计算一次。
  • 空间复杂度:O(new_tasks),保存从 1 到 new_tasks 的最
THE END