我采用了略有不同的方法来产生解决方案。
我首先通过使用以下方法计算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,14,25,41,63 ...
4只猫:
1,3,7,15,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)中进行计算。