题目:
给你一个整数 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 美元
代码:
class Solution {
public:
int distMoney(int money, int children) {
money=money-children;//至少分一块钱
if(money<0)
{
return -1;
}
if(money==7*children)
{
return children;
}
if(money%7==3)
{
//分最多个8以后出现3
if(money==7*(children-1)+3)
{
//此时正好只剩一个不是8
return children-2;
}
}
return min(money/7,children-1);
}
};
思路:
本题的难点在于不能给孩子分到4块钱,对这个条件需要单独分析
首先判断条件一每个孩子至少一块钱,所以有money=money-children这一步,这部就是假设给每个孩子已经分了一块钱,此时若money小于0,则代表不能满足条件1,返回-1.
在给每个孩子分了一块钱后,剩下的钱要尽可能多的分出7(和先前给的1块钱合并成8块钱)。
这里分7后存在几种可能:
可能1:分的7的个数比孩子还多。
可能2:分的7的个数刚好是孩子数
可能3:分的7的个数比孩子要少
对于可能1和可能2,在尽可能多的分7给孩子后不可能存在有孩子最后只分得4块钱(可能1可以把剩余所有钱全给1个孩子,这样所有孩子分的钱都大于或者等于8,不会有分4块钱的。可能2所有孩子全是8块钱,也不会有分4块钱的)。只有可能3有孩子只有4块钱的可能。接下来探讨一下可能3什么时候会出现孩子分4块钱:就是只有一个孩子此时分不到7,且剩余钱刚好是3块。所以代码中有判断 if(money==7*(children-1)+3),此时只能让一个原本是8块钱的孩子分担,因此这时候就有两个孩子不能有8块钱。除去这种情况后,对于分7比孩子多和比孩子少,都能统一用 return min(money/7,children-1);若分的多余孩子,则返回children-1,分的少于孩子,则返回money/7。等于孩子数的时候,return children;。