页面启动中 . . .

双周赛100 T1:把钱分给最多的儿童


双周赛100T1:将钱分给最多的儿童

1. 题目说明

​ 给你一个整数 money ,表示你总共有的钱数(单位为美元)和另一个整数 children ,表示你要将钱分配给多少个儿童。

​ 你需要按照如下规则分配:

  • 所有的钱都必须被分配。

  • 每个儿童至少获得 1 美元。

  • 没有人获得 4 美元。

    请你按照上述规则分配金钱,并返回 最多 有多少个儿童获得 恰好 8 美元。如果没有任何分配方案,返回 -1.


  • 示例

  • 输入:money = 20, children = 3
    输出:1
    解释:
    最多获得 8 美元的儿童数为 1 。一种分配方案为:
    - 给第一个儿童分配 8 美元。
    - 给第二个儿童分配 9 美元。
    - 给第三个儿童分配 3 美元。
    没有分配方案能让获得 8 美元的儿童数超过 1 。
    

2. 解答分析

  • 分析:
    • 最开始一以为这类题目都是直接模拟来做,但是发现限定条件有点多,主要是不好分类。这里条件2:每个儿童至少获得1美元,这里需要保证的是儿童分到的钱不为0,至少为1换句话说就是先给每个儿童分配1美元 //对应的是:money-children。此时如果money<0,那么直接返回-1。
    • 然后目的:返回获得8美元的儿童的最大数量,此时条件改为每个获得7美元的儿童最大个数,我们将此时的money / 7 ,让尽可能多的儿童分到7美元,并向下取整,并且需要同当前的儿童的个数进行对比,不能够超过儿童实际人数,返回的是ans=Math.min(money/7,children);并且此时的money-=ans*7;//最后的钱数,children-=ans;//剩余的未分配的儿童人数
    • 此时开始判定条件1和条件3:每个人都必须分配,没有儿童分到了4美元
        1. 如果此时剩余0人,也就是全部儿童都分完了(钱数都是8),如果money>0,说明还需要再分给一个儿童,也就是ans-1,有一个儿童不是8。
        1. 如果此时剩余1人(此时此人的钱数是1),且money=3,为了避免分配4美元,需要的是将此时的3分配给一个分到8的儿童,此时ans-1;
        1. 其余情况全部给一个人,如果这个人分配到4美元,那么它可以继续分给其他人,ans的总数保持不变。(也就是剩余money的值无非是mod7的正整数剩余系,4,5;6就进一位了,人数向下取整的时候要+1;对应的人数也是如此,剩余2、3…人数越多越可以分配剩余钱数不到4美元)。

3. 具体代码

  • 代码

  • class Solution{
        public int distMoney(int money,int children){
            money-=chilrdren;//最开始的每个人初始值要为1
            if(money<0) return -1;//不满足每个儿童获得钱数至少为1的条件,返回-1、
            int ans=Math.min(money/7,children);
            money-=ans*7;
            children-=ans;
            if(children==0 && money>0
              ||children==1 && money==3){
                ans--;
            }
            return ans;
        }
    }
    
  • 总结: 时间复杂度为O(1),未用到循环遍历空间复杂度为:O(1),仅使用了若干额外的变量。


END~

2

文章作者: XKJ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 XKJ !
  目录