通过率 53% · 提交 562 · 通过 299
小慕负责的项目组共有N个开发人员,他接到了M个独立的,每个需求的工作量不同,且每个需求只能由一个开发人员,不能多人合作。 假定各个需求之间无任何先后依赖关系,请设计算法帮助小慕进行工作安排,使整个项目能用。
这类题属于华为 OD 机考真题方向中「200分 / 贪心」方向的高频题型,通常考察对「200分 / 贪心」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行输入为M个需求的工作量,单位为天,用逗号隔开。 例如:X1 X2 X3 … Xm 。
表示共有M个需求,每个需求的工作量分别为X1天,X2天…Xm天。
其中0 < M < 30;0 < Xm < 200
第二行输入为项目组人员数量N
最快完成所有工作的天数
示例 1
输入示例
6 2 7 7 9 3 2 1 3 11 4 2
输出示例
28
共有两位员工,其中一位分配需求 6 2 7 7 3 2 1 共需要28天完成,另一位分配需求 9 3 11 4 共需要27天完成,故完成所有工作至少需要28天。
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
又是一道描述相当晦涩的题目(很想骂人)。用比较简洁的数学语言来描述就是,将数组 X1, X2, X3, ... , Xm 分为 N 部分(并非子数组,不要求连续),设每一部分的和为 sum1, sum2, ..., sumN,要求找到一种分配方式使得 max(sum1, sum2, ..., sumN) 最小。
用一句简单的话来说,就是 最小化各部分求和的最大值。这种设问一定要想到用 二分 来完成。
将问题转化为,我们需要找到一个阈值 k(一个人的最大工作量),并将原数组 nums 可以被分为 N 部分(分配给 N 个人),使得这 N 部分的各自求和的最大值都不会超过 k(每个人各自的工作量不会超过 k)。
显然 k 的选择是一个 二段性问题:
nums 无论怎么分配都无法完成要求nums 无论如何分配都可以完成要求必然存在一个 临界值 k,使得存在 nums 的分配结果恰好完成要求。
我们希望找到这个阈值 k,因此需要对 k 进行二分查找,二分查找的范围为 [max(nums), sum(nums)]。当:
而上述二分过程的 贪心子问题 为:当我们选择了阈值 k 时,数组 nums 能否被分割不超过 N 部分?
这个问题就和 【贪心】2023B-数据最节约的备份方法 几乎完全一致了,其代码为:
初始化 左闭右开区间 left = max(nums),right = sum(nums) + 1,进行二分。
计算 mid = (left + right) // 2。当:
故结合贪心子问题,整体的二分代码为:
复杂度分析 设 m 为需求个数(数组 nums 的长度),S 为所有需求工作量之和 sum(nums)。
因此总时间复杂度为 O(m^2 log S),瓶颈在贪心检查的双重循环。空间上每次检查会新建长度为 m 的 check 标记数组,空间复杂度为 O(m)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有