谁能给我一个提示,如何找到下面这个问题的有效解决方案
亚历克斯带了一个面包卷到厨房,他想和同事们分享。要做到这一点,他想把纸卷切成N等份。当然,这卷纸只能横切。因此,亚历克斯将作出决定− 1用小刀定期切割
咖啡休息回来后,亚历克斯想知道——如果瓦尼亚的刀无限长(换句话说,如果他一次能切出他想要的任意多个伤口,如果这些伤口在一条直线上),是否可以少动几次?据信,切割的位置是事先规划好的,所有切割都精确无误
事实证明你可以。例如,如果Alex想将纸卷分成4部分,他可以做两次切割-首先他将纸卷分成两半,然后将两半合并,同时将两者切成两半。所以我需要找到最小的切割
给定N人
六,
结果
三,
给定N人
五,
结果
三,
我可以和少数人一起做,但如果有100或1000人呢
我的代码如下:
public class Cake{
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int number = Integer.parseInt(reader.readLine());
int all = 0;
if (N % 2 == 0) {
all = number/ 2;
}
else {
all = number / 2 + 1;
}
System.out.println(all);
}
}
这确实是一道数学题。两个人的第一次电源需要原木(N,2)切割,额外的人需要一次切割
输出:
要验证是否存在较大的数字,可以模拟切割:
假设你每次都有策略地放置这些碎片,那么你需要切割的最后18个碎片正好是总长度的2/50,其他14个碎片是1/50
有几种方法可以实现“战略性”削减。下面是一个例子:
括号不可缩放。1/50的碎片不会再切割
如果您想要此计算的递归版本,可以在每次将人数除以2时计算1,然后在这些划分中至少有一个奇数结果时添加1:
使用递归算法
注:Alain T答案为精确公式
代码
输出
相关问题 更多 >
编程相关推荐