题目描述
小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。
当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。
小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。
输入描述
抓取的糖果数(<10000000000):15
输出描述
最少分至一颗糖果的次数:5
用例
输入 | 15 |
输出 | 5 |
说明 |
|
题目分析
本题由于是每次折半,因此本题数量级即便很大,也不怕超时。
没有了超时的后顾之忧,本题,直接可以暴力逻辑求解,假设输入的是num,分配次数count初始为0,那么:
- 如果num % 2 == 0,则可以直接折半,此时分配次数count++, num /= 2
- 如果num % 2 !=0,则不可以直接折半,此时需要开两个分支:
- 取出一个糖,即num += 1,然后分配次数count++,之后继续前面折半逻辑
- 放回一个糖,即num -= 1,然后分配次数count++,之后继续前面折半逻辑
最终我们只需要在众多分支中,取最少的count即可。
上面逻辑可以基于递归实现。具体实现请看代码。
Java算法源码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(getResult(sc.nextLong()));
}
public static long getResult(long num) {
int[] ans = {Integer.MAX_VALUE};
recursive(num, 0, ans);
return ans[0];
}
public static void recursive(long num, int count, int[] ans) {
if (num == 1) {
ans[0] = Math.min(ans[0], count);
return;
}
if (num % 2 == 0) {
recursive(num / 2, count + 1, ans);
} else {
recursive(num + 1, count + 1, ans);
recursive(num - 1, count + 1, ans);
}
}
}
JS算法实现
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
console.log(getResult(Number(line)));
});
function getResult(num) {
ans = [Infinity];
recursive(num, 0, ans);
return ans[0];
}
function recursive(num, count, ans) {
if (num == 1) {
ans[0] = Math.min(ans[0], count);
return;
}
if (num % 2 == 0) {
recursive(num / 2, count + 1, ans);
} else {
recursive(num + 1, count + 1, ans);
recursive(num - 1, count + 1, ans);
}
}
Python算法源码
import sys
# 输入获取
num = int(input())
def recursive(num, count, ans):
if num == 1:
ans[0] = min(ans[0], count)
return
if num % 2 == 0:
recursive(num // 2, count + 1, ans)
else:
recursive(num + 1, count + 1, ans)
recursive(num - 1, count + 1, ans)
# 算法入口
def getResult():
ans = [sys.maxsize]
recursive(num, 0, ans)
return ans[0]
# 算法调用
print(getResult())
C算法源码
#include <stdio.h>
#include <limits.h>
#define MIN(a,b) (a) < (b) ? (a) : (b)
void recursive(long long num, int count);
int ans = INT_MAX;
int main() {
long long num;
scanf("%lld", &num);
recursive(num, 0);
printf("%dn", ans);
return 0;
}
void recursive(long long num, int count) {
if(num == 1) {
ans = MIN(ans, count);
return;
}
if(num % 2 == 0) {
recursive(num / 2, count + 1);
} else {
recursive(num + 1, count + 1);
recursive(num - 1, count + 1);
}
}
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0