我被邀请参加谷歌的足球挑战。我目前在2.2级,有以下问题。
可爱的幸运羔羊
做个跟班可不全是苦差事。偶尔,当兰布达指挥官感到慷慨时,她会分发幸运羔羊(兰伯达的万能金钱雄鹿)。追随者可以用幸运的羊羔买第二双袜子,枕头作为他们的铺位,甚至第三天的饭!然而,实际上分发羊羔并不容易。每个追随者队伍都有一个严格的资历等级,这必须得到尊重--否则,这些追随者会反抗,你们都会再次被降职为奴才!
为了避免叛乱,你必须遵守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代码:
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条,最后两条代码失败了。我不确定这里是否有我遗漏的边缘情况。任何帮助/建议都是非常感谢的。谢谢!!
发布于 2017-04-17 03:18:51
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)发布于 2017-04-16 02:11:57
测试9检查像答案(13)这样的情况。在这种情况下,min_hunchmen = 4,而不是3。几何顺序说你付给第四个追随者8美元,如果total_lambs = 13,这是不可能的,但你可以支付第四个追随者6美元,而不违反任何规则。
一张额外的支票,看看剩馀的现金是否比支付给最后两个追随者的钱还多,就能解决这个问题。
希望这会有所帮助,如果你知道如何通过测试#10,请随意分享:)
https://stackoverflow.com/questions/43429328
复制相似问题