分糖果
难度:★
题目比较简单,注意次数最少的判断条件。
分糖果
知识点贪心
时间限制:1s 空间限制:32MB 限定语言:不限
题目描述:
小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。
当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。
小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。
输入描述:
抓取的糖果数(<10000000000):
15
输出描述:
最少分至一颗糖果的次数:
5
补充说明:
解释:(1)15+1=16;(2)16/2=8;(3)8/2=4;(4)4/2=2;(5)2/2=1;
示例1
输入
15
输出
5
解题思路:
保证糖果数一直是偶数以此减少操作次数。
JAVA代码:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
long temp = scan.nextLong(); // 从输入读取糖果数量
scan.close();
int count = 0; // 操作次数
while (temp != 1) {
count++;
if (temp == 2) {
// 当糖果数量为2时,直接输出操作次数并返回
System.out.println(count);
return;
}
if (temp % 2 == 0) {
// 如果糖果数量是偶数,将糖果数量除以2
temp = temp / 2;
} else {
if ((temp + 1) / 2 % 2 == 0) {
// 如果糖果数量加1再除以2是偶数,将糖果数量加1
temp++;
} else {
// 如果糖果数量加1再除以2是奇数,将糖果数量减1
temp--;
}
}
}
System.out.println(count); // 输出最少操作次数
}
代码说明:
代码思路和实现说明如下:
在主函数main
中,首先从输入读取糖果数量,并将其存储在变量temp
中。然后初始化操作次数count
为0。
在while
循环中,只要糖果数量temp
不等于1,就执行以下步骤:
- 每次循环,操作次数
count
加1。 - 如果糖果数量
temp
等于2,表示只剩两颗糖果,直接输出操作次数count
并返回。 - 如果糖果数量
temp
是偶数,将糖果数量除以2,即执行一次平均分配操作。 - 如果糖果数量
temp
是奇数,根据(temp + 1) / 2
的奇偶性进行判断:- 如果是偶数,说明将糖果数量加1再除以2后是偶数,将糖果数量加1。
- 如果是奇数,说明将糖果数量加1再除以2后是奇数,将糖果数量减1。
循环结束后,输出最少操作次数count
。