双周赛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美元。-
- 如果此时剩余
0人,也就是全部儿童都分完了(钱数都是8),如果money>0,说明还需要再分给一个儿童,也就是ans-1,有一个儿童不是8。
- 如果此时剩余
-
- 如果此时剩余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~