[Algorithmic Toolbox学习笔记][week3]如何分配糖果

问题描述:

如果你为小朋友举办了一场比赛,最后的赢家能够获得一定数量的糖果(能够获得奖励的小朋友的数量不定)。并且规定排名越高小朋友能够获得的糖果数量也越多,如果你有N颗糖,那么如何才能够合理分配这些糖果让尽可能多的小朋友获得奖励呢?

已知条件:

1. 糖果总数量

求:

1. 能够获得糖果的小朋友的数量
2. 每个小朋友能够获得的糖果数量(排名高的小朋友获得的糖果数量必须高于排名低的小朋友)

例如:8颗糖果可以分配为:[1, 2, 5];10颗糖果可以分配为:[1, 2, 3, 4];
5颗糖果可以分配为:[1, 4]

解题思路:

每次从1开始分配,新一轮的分配都在上一轮的基础上加1(对应列:已分配)

如果当前糖果数量为8:
起始    已分配    剩余
8         1             7                       8 = 1 + 7
7         2             5                       7 = 2 + 5  -->  8 = 1 + 2 + 5
5         3             2                       5 = 2 + 3  -->  8 = 1 + 2 + 2 + 3    不成立,因为出现两个2了

如果当前糖果数量为11:
起始    已分配    剩余
11         1            10                    11 = 1 + 10
10         2            8                      10 = 2 + 8  -->  11 = 1 + 2 + 8
8           3            5                       8 = 3 + 5  -->  11 = 1 + 2 + 3 + 5   
5           4            1                       5 = 4 + 1  -->  11 = 1 + 2 + 3 + 4 + 1  不成立,因为出现两个1了

通过以上规律我们可以得知,当 起始值 <=(已分配 * 2)的时候,这个分配过程就应该结束了。

Implemention

def compute(n):
    ls = []
    numToReach = n
    startNum = 1
    if n == 1 or n == 2:
        ls.append(n)

    else:
        while True:
            if numToReach <= startNum * 2:
                ls.append(numToReach)
                break
            else:
                ls.append(startNum)
                numToReach = numToReach - startNum
                startNum = startNum + 1
    return ls


n = int(input('Please enter the number of candies:'))
print('set:', compute(n))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值