通过率 40% · 提交 1,574 · 通过 632
小慕正在策划部门的 Family Day 开放日活动,其中有一个从桶里取球的游戏。游戏规则如下:有 N 个容量相同的小桶等距排开,每个小桶里默认装了数量不等的小球,小桶里的小球数量记录在数组 bucketBallNums 中。游戏开始时,要求所有桶里的小球总数不能超过 SUM。如果小球总数超过 SUM,则需要为所有小桶统一设置一个 maxCapacity,并将超过该容量最大值的小球从桶中取出,直到每个小桶里的小球数量都不大于 maxCapacity。 请你根据输入的数据,计算出尽可能大的容量最大值 maxCapacity,并输出。 限制规则一 如果所有小桶的小球总数小于 SUM,则无需设置容量值,也无需从小桶中拿球,返回结果 []。 限制规则二 如果所有小桶的小球总数大于 SUM,则需要设置一个尽可能大的容量最大值 maxCapacity,并且需要从小桶中拿球,返回从每个小桶拿出的小球数量组成的数组。
这类题属于华为 OD 机考真题方向中「200分 / 二分查找」方向的高频题型,通常考察对「200分 / 二分查找」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行输入2个正整数,数字之间使用空格隔开,其中第一个数字表示SUM,第二个数字表示bucketBallNums数组长度;
第二行输入N个正整数,数字之间使用空格隔开,表示bucketBallNums的每一项。
一个数组,表示从每个小桶里拿出的小球数量。
示例 1
输入示例
14 7 2 3 2 5 5 1 4
输出示例
[0, 1, 0, 3, 3, 0, 2]
小球总数为22,SUM = 14,超出范围了,需从小桶取球。
示例 2
输入示例
3 3 1 2 3
输出示例
[0, 1, 2]
小球总数为6,SUM = 3,超出范围了,需从小桶取球。 取maxCapacity = 1,则小球总数为 3,从 0 号桶取出 0 个球,从 1 号桶取出 1 个球,从 2 号桶取出 2 个球。故输出[0, 1, 2]。
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
考虑容量最大值 `maxCapacity` 与剩余小球数量之间的关系。
bucketBallNums 中需要取出的小球数越少,剩余小球数量越多。当取到最值 maxCapacity = max(bucketBallNums) 时,则无需取出任何小球,bucketBallNums 等同于初始状态,必然大于 `SUM`。bucketBallNums 中需要取出的小球数越多,剩余小球数量越少。当取到最值 maxCapacity = 0 时,则需取出所有小球,此时剩余小球数量为 0,必定小于等于 `SUM`。对于在区间 [0, max(bucketBallNums)] 之间取值的容量最大值 maxCapacity 而言,一定存在一个值 `ans`,使得:
maxCapacity ∈ [0, ans] 时,剩余球数小于等于 SUMmaxCapacity ∈ (ans, max(bucketBallNums)] 时,剩余球数大于 SUM这体现了这个问题的二段性,ans 是我们需要的答案,而 ans 的寻找就可以用二分查找来完成。
如果 sum(bucketBallNums) < SUM,那么无需设置容量最大值 `maxCapacity`,直接输出空列表 []。这种情况需要单独讨论。
对于二分查找过程中得到的每一个容量最大值 maxCapacity = mid,我们都要计算得到原数组 bucketBallNums 取出小球后的剩余球数。对于 bucketBallNums 中每一个元素 num,当:
bucketBallNums[i] = num < maxCapacity 时,在 bucketBallNums[i] 中无需取出任何小球,故求和时应该用 num 进行求和bucketBallNums[i] = num ≥ maxCapacity 时,在 bucketBallNums[i] 中需要取出若干球,直到 num 变为 maxCapacity,故求和时应该用 maxCapacity 进行求和上述逻辑整理为代码即构建 getSumWithMaxCap(maxCapacity, bucketBallNums) 函数:
复杂度分析 设 n 为小桶个数(数组 bucketBallNums 的长度),V 为桶中球数的最大值 max(bucketBallNums)。
因此总时间复杂度为 O(n log V),瓶颈在二分内每一轮的整组求和。空间上除输入外,主要是长度为 n 的答案数组,空间复杂度为 O(n)。另外注意 C++ 版本用 long 存储球数与总和,避免 n 个桶求和时超出 int 范围。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
示例 3
输入示例
6 2 3 2
输出示例
[]
小球总数为5,SUM = 6,无需从小桶取球;
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有