Google Foobar挑战(Python)-Lucky LAMBS问题



问题是:

做党羽并不全是苦差。偶尔,当Lambda指挥官感到慷慨时,她会分发Lucky LAMB(Lambda的万能钱袋(。母鸡可以用Lucky LAMB买第二双袜子、铺位枕头,甚至第三顿饭!

然而,实际上分发LAMB并不容易。每个党羽都有一个严格的资历排名,必须受到尊重-否则党羽会反抗,你们都会再次被降级为小黄人!

为了避免反抗,你必须遵守4条关键规则:

  1. 资历最浅的党羽(资历最少(正好得到1个LAMB。(总会有一个团队中至少有一个党羽。(
  2. 如果排名在党羽之上的人获得了两倍以上的选票,党羽就会反抗LAMB的数量
  3. 如果给下两个下属的LAMB数量加起来是超过了LAMB的数量。(注意,两个资历最浅的党羽不会有两个下属,所以这条规则不适用于他们。在LAMB的数量与最初级的党羽的数量一样少。(
  4. 你总能找到更多的党羽来付钱——指挥官有很多员工。如果有剩下的LAMB足够多,这样在服从的同时,可以增加另一个党羽作为最高级的党羽其他规则,你必须总是添加并支付那个追随者

请注意,您可能无法分发所有LAMB。单个LAMB无法细分。也就是说,所有党羽都必须得到一个正整数的LAMB。

编写一个名为solution(total_lambs(的函数,其中total_lambs是您试图划分的讲义中LAMB的整数。它应该返回一个整数,表示可以共享LAMB的党羽的最小和最大数量之间的差异(即,分别对你支付的人尽可能慷慨和尽可能吝啬(,同时仍然遵守上述所有规则以避免反抗。例如,如果你有10个LAMB,并且尽可能慷慨,你只能支付3个党羽(按资历升序排列,分别为1、2和4个LAMB(,而如果你尽可能吝啬,你可以支付4个党羽。因此,解决方案(10(应返回4-3=1。

为了让事情变得有趣,Lambda指挥官改变了Lucky LAMB支出的大小。您可以期望total_lambs始终是小于10亿(10^9(的正整数。

我的代码:

def solution(total_lambs):
if total_lambs <= 10**9:
return h_stin(total_lambs) - h_gen(total_lambs)
else: return 0
def h_gen(total_lambs):
x = 1
# I have directly used formulas for sum and nth term of GP instead of assigning them variables
while (2**x - 1) < total_lambs:
x += 1
if (2**x - 1) <= total_lambs or 2**(x-2) + 2**(x-3) <= total_lambs - (2**(x-1) - 1):
return x
else: return x-1
def h_stin(total_lambs):
if total_lambs == 1:
return 1
if total_lambs == 2:
return 2
arr = [1, 1]
for i in range(1,10**9):
if sum(arr) < total_lambs:
arr.append(arr[i] + arr[i-1])
else: break
if sum(arr) <= total_lambs:
return len(arr)
else: return len(arr) - 1

当我在电脑上的命令行中运行这段代码时,它会返回正确的输出,但当我在foobar终端上验证它时,它说10种情况中有9种情况测试失败。有人能帮我吗?如果我的代码是错误的,也请告诉我。谢谢

似乎当你慷慨的时候,你会支付1、2、4、8、16,这样n个党羽就可以获得2**n - 1单位。

当你吝啬的时候,你会付出1、1、2、3、5。。。(你能说斐波那契吗?(,所以m个党羽得到F(0(的和。。。。。即F(m+1(-1。

所以你必须找到最大的n,使得2 ** n - 1 <= lambs和最大的m,使得F(m + 1) - 1 <= lambs

这是一个谷歌编码的挑战,所以你需要自己编写代码。

最新更新