谜题:向团队分配资金

时间:2016-12-13 22:21:46

标签: python algorithm

我正在进行一项编程挑战,你必须向分层团队分配资金。基本的想法是弄清楚,给定金额, 1.团队中最多的人数是多少? 2.你团队中最少的人数是多少?

排名最低的会员总是收到1美元,其他关键规则是:

  1. 团队成员的钱不能超过他下面的成员的两倍。
    • [1,2,4,8]确定
    • [1,2,5,11] INVALID
  2. 团队成员不能低于他下面两个团队成员的总和。
    • [1,1,2,3,5]确定
    • [1,2,3,4,5] INVALID
  3. 我以为我解决了这个问题,但我的程序只通过了10个测试用例中的9个。遗憾的是,测试用例的细节对我来说是隐藏的。

    所以我想弄清楚这个漏洞是在我的逻辑还是我的实现中。首先,逻辑:

    • 为了拥有最大可能的团队,你应该根据Fibonacci系列分配资金,即[1,1,2,3,5,8,13,21 ...... ]
    • 为了结束最小的可能的团队,您应该根据2的权力分配资金,即[1,2,4,8,16,...] < / LI>

    这两个陈述看起来合情合理吗?

    [添加代码]

    听起来很像,所以现在我正在考虑这段代码可能出现的问题:

    def smallest_group(total):
        pile = total
        men = 0
        while True:
            if (pile - 2 ** men) >= 0:
                pile = pile - 2 ** men
                men += 1
            else:
                # We don't have (2 ** men) money left, but
                # if we have enough money to add a team member,
                # the problem requires us to do so
                lowest = 2 ** (men-1) + 2 ** (men-2)
                if pile >= lowest:
                    return men + 1
                else:
                    return men
    
    def fib():
        a,b = 1,1
        yield a
        yield b
        while True:
            a, b = b, a + b
            yield b
    
    def largest_group(total):
        f = fib()
        pile = total
        men = 0
        for man in range(100):
            distribution = f.next()
            if (pile - distribution) >= 0:
                pile = pile - distribution
                men += 1
            else:
                return men
    

    详情/注意事项:

    您无需分配所有资金,最后也不会遗漏任何资金。但是,在你给一个团队成员分配他们之后,如果你还有足够的钱来增加另一个成员(遵守问题中规定的条件),那么你必须这样做。

2 个答案:

答案 0 :(得分:0)

好的,根据您未经编辑的问题,其他答案是有效的。

然而,鉴于您在评论中所陈述的内容,人们可以假设10以上的所有内容都有一些与约束条件一致的表示。因此,使用2**men和斐波那契时,您的推理是有效的。

但是你的实现有点过时了。这些线条有点歪曲了钱会发生什么:

        # We don't have (2 ** men) money left, but
        # if we have enough money to add a team member,
        # the problem requires us to do so
        lowest = 2 ** (men-1) + 2 ** (men-2)
        if pile >= lowest:

可以删除多余的部分。所以men刚刚返回。因此,以下代码将得到答案:

def smallest_group(total):
    pile = total
    men = 0
    while True:
        if (pile - 2 ** men) >= 0:
            pile = pile - 2 ** men
            men += 1
        else:
            return men

def fib():
    a,b = 1,1
    yield a
    yield b
    while True:
        a, b = b, a + b
        yield b

def largest_group(total):
    f = fib()
    pile = total
    men = 0
    for man in range(100):
        distribution = f.next()
        if (pile - distribution) >= 0:
            pile = pile - distribution
            men += 1
        else:
            return men

具有讽刺意味的是,你的代码比它需要的更复杂。

答案 1 :(得分:-1)

更改smallest_group函数会传递所有测试用例:

def smallest_group(total):
    pile = total
    men = 0
    while True:
        if (pile - 2 ** men) >= 0:
            pile = pile - 2 ** men
            men += 1
        else:
            lowest = 2 ** (men-1) + 2 ** (men-2)
            if pile >= lowest:
                return men
                # return men + 1
            else:
                return men

这对我来说似乎不对,因为我确信至少有一些情况下你可以添加一个团队成员,即使你不能按照2 **男人的规则付钱给他。所以我不确定该提交什么作为我对挑战的“回答”。