【发布时间】:2020-09-13 04:59:36
【问题描述】:
使用机器人开采 n 克矿物,该机器人可以通过每天开采 1gm 或每天创建另一个机器人来度过一天 - JPMC 面试问题
- 新建机器人一天后才能开始工作。
- 开采 n 克矿物需要多少天/多少个机器人?
例如:输入 1 输出 1 输入 4 输出 3
【问题讨论】:
-
那你的答案是什么?
标签: algorithm data-structures puzzle
使用机器人开采 n 克矿物,该机器人可以通过每天开采 1gm 或每天创建另一个机器人来度过一天 - JPMC 面试问题
例如:输入 1 输出 1 输入 4 输出 3
【问题讨论】:
标签: algorithm data-structures puzzle
机器人的最佳输出完全取决于它还有多少天可以工作。我们可以很容易地给出一个最优的递归:
def optimal_output(days):
if days == 0: return 0
if days == 1: return 1
return max(optimal_output(days - 1) + 1, # Mine.
optimal_output(days - 1) + optimal_output(days - 2)) # Create robot.
我们可以看看前几个术语:
>>> [optimal_output(n) for n in range(10)]
[0, 1, 2, 3, 5, 8, 13, 21, 34, 55]
嘿,这只是斐波那契。这是有道理的,因为在第 3 天之后,optimal_output(days - 1) + 1 永远不会高于optimal_output(days - 1) + optimal_output(days - 2),我们只剩下斐波那契的重现。
以上假设第 1 天建成的机器人只能在第 3 天开始工作。如果它可以在第 2 天开始工作,我们有以下重复:
def optimal_output(days):
if days == 0: return 0
if days == 1: return 1
return max(optimal_output(days - 1) + 1, # Mine.
optimal_output(days - 1) + optimal_output(days - 1)) # Create robot.
简化为f(1) =、f(n) = 2f(n-1),或者换句话说,就是二的幂。
【讨论】:
int findMinDaysUsingMath(int grain) {
return (int) Math.ceil(Math.log(grain) / Math.log(2)) + 1;
}
【讨论】: