通过率 62% · 提交 343 · 通过 213
小慕在整理项目材料时,随手从资料盒中取出一叠文件。每次小慕会将其中一半的文件分发给团队成员。 当文件数量无法被时,小慕可以选择从资料盒中(假设盒中文件足够)取出一份文件,或放回一份文件。 小慕操作(取出、放回和平均分发均算一次),才能将手中的文件数量减少到只剩一份。
这类题属于华为 OD 机考真题方向中「100分 / 递归」方向的高频题型,通常考察对「100分 / 递归」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
抓取的糖果数(<10000000000)
最少分至一颗糖果的次数
示例 1
输入示例
15
输出示例
5
15+1=16 16/2=8 8/2=4 4/2=2 2/2=1
示例 2
输入示例
6
输出示例
3
6/2=3 3-1=2 2/2=1
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题是一道比较有意思的题目。从题意描述到解题思路,个人都比较喜欢。
本题的数据量看似给得非常大(N < 10000000000),但是仔细思考可以发现,每一次我们都会近似地让糖果数量减半,因此糖果数减少到1的速度是对数级别的。
我们可以直接使用一个 O(logN) 的模拟算法来解决这个问题。
考虑某一个特定的糖果数量 num,且到达 num 的操作次数为 time。当:
num // 2 的糖果,需要 time + 1 次操作。这里的 1 次操作,是减半操作。(num+1) // 2 或 (num-1) // 2 的糖果,需要 time + 2 次操作。这里的 2 次操作,有 1 次是减半操作,有 1 次是 +1 或 -1 操作。显然,对于任意的 num,如果已知对应的 time,我们就可以计算出其近似减半后的结果。而近似减半后的结果得到之后,我们又可以做类似的重复操作,直到最终糖果数量减少到 1。
这种重复的过程,容易想到可以使用递归来完成。考虑递归三要素:
num = n,以及初始操作次数 time = 0num 的减半过程,也就是上述的讨论。num 减少到 1 的时候,可以更新答案。本题的递归过程和动态规划非常类似,可以多加以比较。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有