力扣2591. 将钱分给最多的儿童

题目描述:

给你一个整数 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

思路:

纯纯的模拟题,想都不想随便写一下交上去

力扣2591. 将钱分给最多的儿童_第1张图片

真的吐了。

这说明一件事,虽然是简单题,但是还是要仔细一点,小心使得万年船啊。

记住这里求的答案不是分配方案数,而是在符合分配方案的集合里面去挑分得8的数量最多的一种方案。

这个题目的答案一共分为三种:

1.有分配方案但是恰好获得8美元儿童没有,是没有也是不可能。此时答案返回为0。

2.没有分配方案,也就是不符合分配方案的要求。

3.除以上两种。

首先我们就要判断什么情况下不能满足分配条件,一种是money小于children,此时不能让每个人都分到最少一美元,第二种是一定存在分给别人4美元的情况,也就是只有一个人,这个时候的钱又刚好等于4,不满足条件的第三点。

然后我们还可以特判一下这种情况:假如money很大,即使每个人都分8美元都还有剩余,这个时候为了让剩下的8最多,只能把多的钱都分给一个人,这样一来,就有children-1个人分到8美元。

然后我们开始正常的模拟:(用ans记录分的的8美元的人数)

1、先每个人都分1美元

2、看剩下的钱还有多少个7美元,这些7美元都可以分出去凑成8美元,ans+=money/7.

3、如果剩下的钱刚好等于3,这个时候已经还有一个人没有分到8美元,那么这个3加上原来的1等于4,不符合分配条件,所以这个时候我们就只能把这3美元再拆出来一部分分到之前的8美元的一个人里面,这个时候的ans--。

代码:

class Solution {
public:
    int distMoney(int money, int children) {
        if(moneychildren*8)return children-1;//每个人分到8美元都还有多的,那就把多的全给一个人

        money-=children;//先每个人分一美元

        ans+=money/7;//最多能分多少个7美元,先下取整

        money-=money/7*7;//剩下的钱

        if(money==3&&ans==children-1)ans--;//如果这个时候还有一个人没有分到8美元,剩下3美元
        return ans;
    }
};

你可能感兴趣的:(力扣刷题,leetcode,算法,职场和发展)