使用机器人开采 n 克矿物 - JPMC 面试问题

Mine n grams of mineral using robot - JPMC Interview question

使用机器人开采 n 克矿物,该机器人可以通过每天开采 1 克或每天创建另一个机器人来度过一天 - JPMC 面试问题

例如:输入 1 输出 1 输入 4 输出 3

机器人的最佳产出完全取决于它还能工作多少天。我们可以很容易地给出最佳循环:

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) 或者换句话说,2 的幂。

int findMinDaysUsingMath(int grain) {
    return (int) Math.ceil(Math.log(grain) / Math.log(2)) + 1;
}