华为机试真题实战应用【赛题代码篇】-分发糖果(附Java、Python和C++代码实现)

题目描述


小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。

当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。

小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。

输入描述:


抓取的糖果数(<10000000000):15

输出描述:


最少分至一颗糖果的次数:5

示例 1
输入:15
输出:5

解释:
(1) 15+1=16;
(2) 16/2=8;
(3) 8/2=4

(4)4/2=2

(5)2/2=1

说明:因为测试用例有限,所以用解法1和解法2硬匹配前2000个结果,都是一样的,所以可以确认解法1是对的

知识储备

动态规划、01背包    300/中等

思路解析

要想分出最少的糖果,利用贪心思想,肯定是相邻位置没有增加的情况下,大家都分到1,相邻位置有增加的情况下,分到糖果数加1就好。什么情况下会增加糖果,相邻位置有得分差异,可能是递增可能是递减,如果是递增的话,糖果依次加1,如果是递减糖果依次减1?这不符合最小,因为减到最后一个递减的位置可能不是1,必须从1开始加才是最小,那我们可以从最后一个递减的位置往前反向加1.

  • step 1:使用

猜你喜欢

转载自blog.csdn.net/qq_36130719/article/details/127412339
今日推荐