力扣每日一题:将钱分给最多的儿童

题目:

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

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