华为 · dfs · 算法编程题
华为 dfs n ≤ 20 时限 1 秒 / 256 MB

题目描述

一个云计算中心接收到了一系列需要连续处理的微任务。现在有 n 个任务排成一队,每个任务都有一个已知的计算成本。为了高效利用服务器资源,系统需要将这 n 个连续的任务划分成 m 个“批次”进行处理。
划分的规则是:必须按照任务队列的顺序进行划分,不能打乱任务原有的先后次序。例如,第一个批次处理前 k_1 个任务,第二个批次处理接下来的 k_2 个任务,以此类推。
为了使服务器负载尽可能平稳,调控目标是:找到一种划分方案,使得这 m 个批次各自的“总计算成本”(即批次内所有任务的成本之和)的标准差达到最小。
你的任务就是找出这个最优的划分方案。

输入输出

输入描述
第一行输入两个整数,第一个是任务总数 n ( 2 < n ≤ 20 ),第二个是需要划分的批次数目 m ( 2 < m < n )。
第二行输入一个包含 n 个正整数的序列 C = c_0, c_1, ..., c_n-1 ,其中第 i 个元素 c_i 代表第 i 个任务的计算成本 ( 0 < c_i < 100 )。
输出描述
输出一行,包含 m 个整数,代表最优划分方案中,每个批次依次包含的任务数量。
例如,输出 `3 3 2 2` 表示:第 1 批包含前 3 个任务,第 2 批包含接下来的 3 个任务,第 3 批包含再接下来的 2 个任务,第 4 批包含最后 2 个任务。

样例共 1 组

样例 1
输入
8 4
30 42 85 19 65 13 94 57
输出
2 1 3 2

算法解析依据充分

考点:dfs

数据规模 n ≤ 20 | 限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 20
  • 元素值域:c_i ≤ 100(注意整数类型选择,避免溢出)
  • 复杂度门槛:允许指数级做法:暴力枚举全部子集 2^n / 回溯搜索 / 状压 DP。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:dfs

本题切入点

n≤20 极小,划分方案数只有 C(n−1, m−1)(最大约 9 万),直接 DFS 枚举每个切分点、累计各批成本并实时更新标准差最优解即可。

一条路走到底再回溯,适合枚举全部方案与连通性判定。

思路框架(dfs 通法 · 非本题专属)

  1. 定义递归函数(当前状态、已选集合、累计答案)。
  2. 写终止条件,达到终止条件时结算答案。
  3. 枚举下一步的所有选择,做选择 → 递归 → 撤销选择(回溯)。
  4. 大规模的连通块统计可用 DFS/BFS 染色标记。

实现要点:回溯时务必把状态恢复干净;必要时加剪枝(可行性剪枝、最优性剪枝)。

复杂度:时间 O(状态数) | 空间 O(递归深度)

该范式的通法易错点

  • 回溯时忘记撤销状态,答案被污染。
  • 没有剪枝导致指数级爆炸超时。

对照本题

  • 数据规模 n ≤ 20,允许指数级做法:暴力枚举全部子集 2^n / 回溯搜索 / 状压 DP。
  • 元素值域最大到 100 —— 求和 / 相乘时记得开 64 位整数。

样例

样例 1

  • 输入:8 4 / 30 42 85 19 65 13 94 57
  • 输出:2 1 3 2

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-8月27号开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解