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

24 篇文章 0 订阅
16 篇文章 0 订阅

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)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值