html做简单网站实例,如何做好网络推广销售,广告店名大全集,seo优化内页排名(新B卷,100分)- 分糖果#xff08;Java JS Python C#xff09;
题目描述
小明从糖果盒中随意抓一把糖果#xff0c;每次小明会取出一半的糖果分给同学们。
当糖果不能平均分配时#xff0c;小明可以选择从糖果盒中#xff08;假设盒中糖果足够…(新B卷,100分)- 分糖果Java JS Python C题目描述小明从糖果盒中随意抓一把糖果每次小明会取出一半的糖果分给同学们。当糖果不能平均分配时小明可以选择从糖果盒中假设盒中糖果足够取出一个糖果或放回一个糖果。小明最少需要多少次取出、放回和平均分配均记一次能将手中糖果分至只剩一颗。输入描述抓取的糖果数1000000000015输出描述最少分至一颗糖果的次数5用例输入15输出5说明15116;16/28;8/24;4/22;2/21;题目分析本题由于是每次折半因此本题数量级即便很大也不怕超时。没有了超时的后顾之忧本题直接可以暴力逻辑求解假设输入的是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(%d\n, 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); } }