我采用了一种稍微不同的方法来产生解决方案。
我首先使用以下方法计算使用x猫和y猜测可以覆盖的最大楼层。
从 1 层开始,不断增加猜测的数量,同时跟踪检查的楼层、哪些猜测他们被检查了以及每个楼层还剩下多少只猫。
重复此操作最多y次。
这种计算给定答案的效率非常低的代码,但对于少量的猫/地板仍然有用。
Python代码:
def next_step(x, guess):
next_x = []
for y in x:
if y[0] == guess:
if y[1] != 1:
next_x.append((guess+1, y[1] - 1))
next_x.append(y)
if y[0] == guess:
next_x.append((guess+1, y[1]))
return next_x
x = [(1, TOTAL_NUM_CATS)]
current_floor = 1
while len(x) <= TOTAL_NUM_FLOORS:
x = next_step(x, current_floor)
current_floor += 1
print len(x)
对于 2 只猫,在 x 次猜测中可以识别的最大楼层为:1、3、6、10、15、21、28
...
对于 3 只猫:
1、3、7、14、25、41、63...
4 只猫:
1、3、7、15、30、56、98...
经过广泛的研究(主要涉及在OEIS中输入数字序列),我注意到x的最大楼层遵循组合分段模式。
对于 2 只猫:
n < 2 : 2^n - 1
n >= 2 : C(n, 1) + C(n, 2)
对于 3 只猫:
n < 3 : 2^n - 1
n >= 3 : C(n, 1) + C(n, 2) + C(n, 3)
对于 4 只猫:
n < 4 : 2^n - 1
n >= 4 : C(n, 1) + C(n, 2) + C(n, 3) + C(n, 4)
从这里开始,我采用了简单递增 n 的简单方法,直到通过所需的楼层数。
Python代码:
def find_smallest(floors, eggs):
maximum_floors = 0
n = 0
while maximum_floors < floors:
maximum_floors = 0
n += 1
if n < eggs:
maximum_floors = 2**n - 1
else:
count = 0
for x in xrange(1, eggs+1):
maximum_floors += combination(n, x)
print n
这给出了 (100, 2) = 14 的正确解。
对于任何希望检查不那么琐碎的东西的人,它给出 (1 000 000, 5) = 43。
这在 O(n) 中运行,其中 n 是问题的答案(猫越多越好)。
但是我确信具有更高数学水平的人可以简化分段公式以在 O(1) 中计算。