某村有m个村民,所有村民的资产均不相同,村长收到一笔n元的捐款,村长计划将捐款分给村民,是尽可能多的村民拥有相同的资产,剩余的资产将保留为集体资产。
请帮村长分配捐款,使得在最多村民拥有相同资产的前提下,并剩余尽可能少的捐款。如果某村民不能通过分配捐款拥有相同的资产,则不予分配。如果有三个村民的资产是10, 3, 1,待分配捐款为8, 则分配结果为10, 10, 1,剩余1的捐款无法使第三个村民的资产达到10, 所以不予分配。
# 输入
5
2 9 3 1 6
4
# 输出
3 1
def allocate(m, n, nums):
'''
m: 人数
n: 总分配资产
nums: 每个人的现有资产
return: 分配资产后资产相等的人数(最多),剩余资产(最少)
'''
nums.sort()
sums = [0]*m
sums[0] = nums[0]
max_p = 0
res_m = n
for i in range(1, m):
sums[i] = sums[i - 1] + nums[i]
for i in range(m):
for j in range(i+1, m):
need = (j - i) * nums[j] - (sums[j-1] - (sums[i] - nums[i]))
tem_p = j - i + 1
if need <= n and tem_p >= max_p:
if tem_p == max_p:
res_m = min(res_m, n - need)
else:
max_p = tem_p
res_m = n - need
if max_p == 0:
res_m = n
max_p = 1
return max_p, res_m