分配捐款-华为真题

文章介绍了一个问题,村长需要将一笔捐款公平地分配给村民,目标是使最多的村民资产相同,同时剩余最少的资产。提供的算法首先对村民的资产进行排序,然后尝试不同的分配策略来找到最佳解,即最大化资产相等的村民数量并最小化剩余资产。
摘要由CSDN通过智能技术生成

某村有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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值