首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google foobar python:两次测试失败--可爱的幸运羔羊(数数序列)

Google foobar python:两次测试失败--可爱的幸运羔羊(数数序列)
EN

Stack Overflow用户
提问于 2017-04-15 17:49:20
回答 2查看 6K关注 0票数 5

我被邀请参加谷歌的足球挑战。我目前在2.2级,有以下问题。

可爱的幸运羔羊

做个跟班可不全是苦差事。偶尔,当兰布达指挥官感到慷慨时,她会分发幸运羔羊(兰伯达的万能金钱雄鹿)。追随者可以用幸运的羊羔买第二双袜子,枕头作为他们的铺位,甚至第三天的饭!然而,实际上分发羊羔并不容易。每个追随者队伍都有一个严格的资历等级,这必须得到尊重--否则,这些追随者会反抗,你们都会再次被降职为奴才!

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

  1. 最低级的亲信(资历最少的)只得到一只羔羊。(一支球队中总会有至少一名追随者。)
  2. 如果排在他们前面的人得到的羔羊数量是他们的两倍以上,那么一个追随者就会反抗。
  3. 如果给下两个下属的羔羊加起来的数量比他们得到的羔羊的数量还要多的话,那么一个亲信就会反抗。(请注意,两个最低级的追随者不会有两个下属,所以这条规则不适用于他们。第二位最低级的追随者至少需要和最低级的亲信一样多的羔羊。)
  4. 你总能找到更多的佣人--指挥官有很多雇员。如果剩下足够多的羔羊,那么在遵守其他规则的同时,还可以增加另一个亲信为最高级的,那么你就必须不断地增加并付钱给那个亲信。

请注意,您可能无法分发所有的羔羊。一只羔羊不能再细分。也就是说,所有的追随者都必须得到一个正整数的羔羊数。

编写一个名为“答案”( total_lambs )的函数,其中total_lambs是要除以的讲义中羊羔的整数。它应该返回一个整数,表示能够分享羊羔的最小和最大数目的区别(也就是说,尽可能慷慨地对待你付出的人和尽可能吝啬的人),同时仍然遵守上述所有规则以避免叛乱。

例如,如果你有10只羔羊,并且尽可能慷慨的话,你只能支付3只追随者(1,2,4只羔羊,按等级排列),而如果你吝啬的话,你可以付给4名追随者(1,1,2和3只羔羊)。因此,答案(10 )应该返回4-3 = 1。为了保持趣味性,Lambda指挥官改变了幸运羔羊支付的大小:您可以期望total_lambs总是在100亿到10亿之间( 10 ^ 9)。

MY方法和代码

为了找到最小的追随者,必须慷慨地给出具有几何级数1,2,4,8的羔羊。由于几何级数之和是由

( $S =2^n-1$因此,信众数为log_2 (S+1) )

为了找到最大的追随者,羔羊必须以吝啬的方式给出,似乎是纤维1,1,2,3,5。我们可以用Fibonacci指数法求出最大的仆从数:

遵循python代码:

代码语言:javascript
复制
from math import sqrt
from math import log
from math import pow

def answer(total_lambs):
    phi = (1+sqrt(5))/2  # golden search ratio
    tau = (1-sqrt(5))/2  # equal to 1/phi
    eps = pow(10, -10)

    max_hunchmen = int(round(log((total_lambs + 1) * sqrt(5)+eps, phi))) - 2
    Fib_num = int(round((pow(phi, max_hunchmen+2)-pow(tau,max_hunchmen+2))/sqrt(5)))
    if total_lambs+1 < Fib_num:
      max_hunchmen -= 1

    min_hunchmen = int(log((total_lambs + 1), 2))

    return abs(max_hunchmen - min_hunchmen)

有10个测试用例(Google不告诉你细节)。这段代码传递了其中的8条,最后两条代码失败了。我不确定这里是否有我遗漏的边缘情况。任何帮助/建议都是非常感谢的。谢谢!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-17 03:18:51

代码语言:javascript
复制
phi = (1+sqrt(5))/2  
tau = (1-sqrt(5))/2  
eps = pow(10, -10)

max_hunchmen = int(round(log((total_lambs + 1) * sqrt(5)+eps, phi))) - 2
Fib_num = int(round((pow(phi, max_hunchmen+2)-pow(tau,max_hunchmen+2))/sqrt(5)))
if total_lambs+1 < Fib_num:
  max_hunchmen -= 1
elif total_lambs + 1 == Fib_num:
    total_lambs = Fib_num
if (total_lambs + 1) % 2 == 0:
     min_hunchmen = int(round(log((total_lambs + 1), 2)))
else:
    min_hunchmen = int(log((total_lambs + 1), 2))

return abs(max_hunchmen - min_hunchmen)
票数 6
EN

Stack Overflow用户

发布于 2017-04-16 02:11:57

测试9检查像答案(13)这样的情况。在这种情况下,min_hunchmen = 4,而不是3。几何顺序说你付给第四个追随者8美元,如果total_lambs = 13,这是不可能的,但你可以支付第四个追随者6美元,而不违反任何规则。

一张额外的支票,看看剩馀的现金是否比支付给最后两个追随者的钱还多,就能解决这个问题。

希望这会有所帮助,如果你知道如何通过测试#10,请随意分享:)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43429328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档