【LeetCode - 每日一题】2591. 将钱分给最多的儿童(23.09.22)

2591. 将钱分给最多的儿童

题意

  • 分钱
  • 求最多的可以拿到 8 8 8 美元的孩子的数量

解法 分类讨论

4 美元的设定很讨厌。但是,只有当 children = 1 && money == 4 的时候,才会出现不能分配的情况。

分类讨论:

  • m o n e y < c h i l d r e n money < children money<children:不能分配,因为每个孩子最少要获得 1 美元。
  • m o n e y > c h i l d r e n money > children money>children
    • 首先计算最多可以获得 8 美元的孩子数 cnt = min(children, money / 8),然后再来分配别的孩子,此时, money -= cnt * 8children -= cnt
      • 如果 m o n e y money money 还有多,但是 c h i l d r e n children children 没有了,则从 c n t cnt cnt 中取出一个孩子来,把剩下的 m o n e y money money 都给他,那么 cnt--
      • 如果 m o n e y money money 没有了,但是 c h i l d r e n children children 还有多,那么一直从 c n t cnt cnt 中取出孩子,直到 m o n e y money money 足够分配 c h i l d r e n children children
        • 那么 最后都会归结到 m o n e y money money 有多,孩子也有多 这个情况。而此时,只有 children = 1 && money == 4 这种情况无法分配,其余情况都可以分配,所以 cnt--
class Solution {
public:
    int distMoney(int money, int children) {
        if(money < children) return -1;

        int cnt = min(children, money / 8);
        money -= cnt * 8;
        children -= cnt;

        if(money > 0 && children == 0)
            cnt--;
        
        while(cnt >= 0 && money < children)
        {
            cnt--;
            money += 8;
            children++;
        }

        // 够每人一美元,看有没有4
        if(money == 4 && children == 1)
            cnt--;
        return cnt;

    }
};

WA哭了 :)

复杂度

时间复杂度: O ( 1 ) O(1) O(1)
空间复杂度: O ( 1 ) O(1) O(1)


你可能感兴趣的:(c++,leetcode,每日一题,leetcode,每日一题,c++)