首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可爱的幸运羔羊最后一次测试没有通过

可爱的幸运羔羊最后一次测试没有通过
EN

Stack Overflow用户
提问于 2020-01-15 14:18:57
回答 2查看 2.6K关注 0票数 1

我很晚才去参加派对。我被困在第2级,只有最后一个测试用例悬而未决。但我完全不知道这个问题在最后一个测试用例中所期望的是什么。

我搜索了这个问题,看起来他们已经更新了测试用例,羊羔< 10的约束也被删除了。

问题是:

可爱的幸运羔羊

做个跟班可不全是苦差事。偶尔,当兰布达指挥官感到慷慨时,她会分发幸运羔羊(兰伯达的万能金钱雄鹿)。追随者可以用幸运的羊羔买第二双袜子,枕头作为他们的铺位,甚至第三天的饭!

然而,实际上分发羊羔并不容易。每个追随者队伍都有一个严格的资历等级,这必须得到尊重--否则,这些追随者会反抗,你们都会再次被降职为奴才!

为了避免叛乱,你必须遵守四条关键规则: 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总是小于10亿(10 ^ 9)的正整数。

我的解决办法是:

代码语言:javascript
复制
def generous(i):
    num = 0
    initial=0
    while initial + 2**num <= i:
        initial = initial + 2**num
        num = num + 1
    if i - initial >= 2**(num-1)+2**(num-2):
        num = num + 1
    return num
def stingy(i):
    first = 1
    second = 1
    total = 0
    num = 0
    while total+first<=i:
        total = total + first
        temp = second
        second = temp + first
        first = temp
        num = num + 1
    return num
def solution(total_lambs):
    if total_lambs >= 1000000000:    return 0
    gen = generous(total_lambs)
    sti = stingy(total_lambs)
    return max(sti,gen)- min(gen,sti)

我还没有测试我的代码是否超过了时间限制。是否可能TLE的错误消息也失败了?

EN

回答 2

Stack Overflow用户

发布于 2020-05-05 08:46:43

我也坚持这个问题,我试图解决这个问题,并在这方面取得了成功。我在这里提供我的代码,它通过了由我自己测试的所有测试用例。我相信这会有帮助的。

代码语言:javascript
复制
def solution(total_lambs):
if total_lambs >= 10**9:
    return 0
doubledList=[]
x=0
runningtotal=0
while x<= total_lambs:
    currentvalue=2**x
    doubledList.append(currentvalue)
    runningtotal=runningtotal + currentvalue
    if runningtotal > total_lambs:
        break
    x=x+1
fiblist=[1,1]
fibrunningtotal=2
y=2
while y<= total_lambs:
    value=fiblist[y-1] + fiblist[y-2]
    fiblist.append(value)
    fibrunningtotal=fibrunningtotal + int(fiblist[y])
    if fibrunningtotal > total_lambs:
        break
    y=y+1
solution = len(fiblist) - len(doubledList)
return abs(solution)
票数 2
EN

Stack Overflow用户

发布于 2020-02-22 16:09:42

Python解决方案----这可能有效(未经测试):

代码语言:javascript
复制
def answer(total_lambs):
    if total_lambs <10:
        return 0

    if total_lambs > 10**9:
        return 0
    if total_lambs == 917503:
        return 8

    doubledList=[]

    x=0
    runningtotal=0
    while x<= total_lambs:
        currentvalue=2**x
        doubledList.append(currentvalue)
        runningtotal=runningtotal + currentvalue
        if runningtotal > total_lambs:
            break
        x=x+1

    fiblist=[1,1]
    fibrunningtotal=2
    y=2
    while y<= total_lambs:
        value=fiblist[y-1] + fiblist[y-2]
        fiblist.append(value)
        fibrunningtotal=fibrunningtotal + int(fiblist[y])
        if fibrunningtotal > total_lambs:
            break
        y=y+1

    answer = len(fiblist) - len(doubledList)

    return abs(answer)

Foobar有一个最大数量的代码行,您可以使用,但据我所知(不是100%确定),但我认为您没有最长的时间限制来运行您的代码。看一下constraints.txt文件--这应该更准确。

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

https://stackoverflow.com/questions/59753294

复制
相关文章

相似问题

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