【2591. 将钱分给最多的儿童】

来源:力扣(LeetCode)

描述:

给你一个整数 money ,表示你总共有的钱数(单位为美元)和另一个整数 children ,表示你要将钱分配给多少个儿童。

你需要按照如下规则分配:

  • 所有的钱都必须被分配。
  • 每个儿童至少获得 1 美元。
  • 没有人获得 4 美元。

请你按照上述规则分配金钱,并返回 最多 有多少个儿童获得 恰好 8 美元。如果没有任何分配方案,返回 -1

示例 1:

输入:money = 20, children = 3
输出:1
解释:
最多获得 8 美元的儿童数为 1 。一种分配方案为:
- 给第一个儿童分配 8 美元。
- 给第二个儿童分配 9 美元。
- 给第三个儿童分配 3 美元。
没有分配方案能让获得 8 美元的儿童数超过 1

示例 2:

输入:money = 16, children = 2
输出:2
解释:每个儿童都可以获得 8 美元。

提示:

  • 1 <= money <= 200
  • 2 <= children <= 30

方法:贪心

思路与算法

首先,若 money < children,则无解,返回 −1。

然后,给每个人先分配 111 美元,令 money 减去 children。

接着,给尽可能多的人分配 7 美元(加上前面分配的 1 美元就是 8 美元),这样最多分给 cnt = min⁡(⌊ m o n e y 7 \frac{money}{7} 7money ⌋,children) 个人。

令 money 减去 7 × cnt,children 减去 cnt。此时还剩余 money 美元和 children 个人,进行分类讨论:

  1. 若剩余 0 个人,并且 money > 0,那么将所有的美元分配给一个已经分到 8 美元的人,令 cnt 减去 1。
  2. 若剩余 1 个人,并且 money = 3,为了避免分到 4 美元,并注意到题目输入中的 children >= 2,因此将这 3 美元拆成两部分,将其中的一部分分配给已经分到 8 美元的人,令 cnt 减去 1。
  3. 对于其他情况,若 money > 0,可以将所有美元分配给一个人,cnt 不变。

代码:

class Solution {
public:
    int distMoney(int money, int children) {
        if (money < children) {
            return -1;
        }
        money -= children;
        int cnt = min(money / 7, children);
        money -= cnt * 7;
        children -= cnt;
        if ((children == 0 && money > 0) || (children == 1 && money == 3)) {
            cnt--;
        }
        return cnt;
    }
};

时间 8ms 击败 34.59%使用 C++ 的用户
内存 5.95MB 击败 7.30%使用 C++ 的用户
复杂度分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千北@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值