本文最后更新于 380 天前,其中的信息可能已经有所发展或是发生改变。
题目描述:
给你一个整数 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
解法一:分类讨论
算法思路:
首先,给每个人至少分配 1 美元,money
减少 children
。
此时如果 money < 0
,则表示无法所有人都至少分配到 1 美元,返回 -1 。
然后依次再给每个人分配 7 美元,最多可以分给 cnt
个人:
$$
cnt = min(⌊money/7⌋, children)
$$
更新剩余 money
和剩余没分配到 8 美元的人数,有以下几种情况:
- 剩余 0 人,且
money > 0
,则把剩余的钱全部给一个人,cnt – 1. - 剩余 1 人,且
money = 3
,如果把剩余的钱给他,则他分到了 4 美元,为了避免这种情况,不给他,给一个分到 8 美元的人,cnt – 1. - 其余情况,剩余的钱全部给一个人,如果他恰好分到 4 美元,给其他一人 1 美元,cnt 不变。
代码实现:
class Solution {
public int distMoney(int money, int children) {
money -= children; // 先给每人分配一美元
if(money < 0)return -1;
int cnt = Math.min(money / 7, children); // 让尽量多的人分到8美元
money -= cnt * 7;
children -= cnt;
if(children == 0 && money > 0 || // 每个人都分了8美元,剩下的全给一人
children == 1 && money == 3){ // 有一人分到了4美元
cnt--;
}
return cnt;
}
}
复杂度分析:
时间复杂度: O(1)
空间复杂度: O(1)