leetcode--将钱分给最多的儿童

leetcode每日一题 2023/9/22

题目链接:https://leetcode.cn/problems/distribute-money-to-maximum-children/description/

虽然标签是简单题,但是中间还是有一点点的绕

1. 计算最分配方案的上限

对于总的金额money,我们可以先计算出该金额尽可能按照8美元分配,最多可以分配 n8 个人,而剩余的金额分为三种情况{0, 4, else},假设剩余金额可以分配 ne 个人,ne 的取值就是 0 和 1;

2. 分情况讨论

先对 ne 的取值做一个判断,如果剩余金额为0, 那么 ne 的取值也为0,否则为1;

  1. 如果n8+ne==children,那么说明份数刚好是够的,但如果剩余金额是4美元,那么 n8 中的某一个人,就不可以分配到8美元
  2. 如果n8+ne大于children,那么说明children中有一个人会拿到大于8美元的数目,其余还是8美元
  3. 如果n8+ne < children,那么说明有部分没有被分配,此时就要考虑拆,先拆多出的余额,如果还是不够,那么少分配一个8美元,拆开8美元,判断是否大于children人数,不够继续拆8美元
class Solution {
public:
    int distMoney(int money, int children) {
        // 分8元的人数
        int n8 = money / 8;
        // 剩余的钱
        int e = money % 8;
        int ne = 0;
        if (e != 0)
            ne = 1;


        if (n8 + ne == children) {
            if (e != 4)
                return n8;
            else
                return n8 - 1;
        }

        else if (n8 + ne > children) {
            return children-1;
        }
        // n8 + 1 < children
        else {
            if (n8 + ne < children) {
                if (n8 + e >= children)
                    return n8;
                else
                    for (int i = 1; i <= n8; i++) {
                        // 拆开后可以分配的人数
                        if (i * 8 + e + (n8 - i) >= children)
                            return n8 - i;
                    }
            }
                

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值