算法|将钱分给最多的儿童

#2591将钱分给最多的儿童:

给你一个整数 money ,表示你总共有的钱数(单位为美元)和另一个整数 children ,表示你要将钱分配给多少个儿童。
你需要按照如下规则分配:
所有的钱都必须被分配。
每个儿童至少获得 1 美元。
没有人获得 4 美元。
请你按照上述规则分配金钱,并返回 最多 有多少个儿童获得 恰好 8 美元。如果没有任何分配方案,返回 -1 。

class Solution {
    public int distMoney(int money, int children) {
        return money == 8 * children ? children 
            : money > 8 * children - 8 && money != 8 * children - 4 ? children - 1
                : money < children ? -1
                    : Math.min(children - 2, (money - children) / 7);
    }
}
  1. 第一次判断 money 是否正好为 children*8,符合条件则直接返回 children.
  2. 第二次判断 money 可以分给 children-1 个人8美元,同时最后一个人分不到8美元了且不分到四美元的情况,符合条件则返回 children-1.
  3. 第三次判断 money 小于 children 的情况,此时不能保证每个人至少分到1美元,故没有分配方案,返回-1.
  4. 最后一行返回获得8美元的人数,且最多有 children-2 个人获得.

出现的问题:自己写的时候没有将 children-2 与 (money - children) / 7 进行比较,产生了用例不通过的问题。

原因:在第二次判断的时候,假如一个人分到四美元,那么是不满足第二次判断的,也就会继续向下进行,最终进行到最后一行。如果直接返回 (money - children) / 7,就会将 children-1 个人分到8美元且一个人分到四美元的情况包含在内,导致返回 children-1(此时应当返回 children-2)。

问题解决:不满足 money > 8 * children - 8 && money != 8 * children - 4 条件的话,就最多只能有 children-2 个人能够分到8美元,因此使用 children-2 对 (money - children) / 7 的上限加以限制。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值