问题描述:
如果你为小朋友举办了一场比赛,最后的赢家能够获得一定数量的糖果(能够获得奖励的小朋友的数量不定)。并且规定排名越高小朋友能够获得的糖果数量也越多,如果你有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))