2591. 将钱分给最多的儿童 – 分类讨论
本文最后更新于 380 天前,其中的信息可能已经有所发展或是发生改变。

题目描述:

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

提示:

  • 1 <= money <= 200
  • 2 <= children <= 30

解法一:分类讨论

算法思路:

首先,给每个人至少分配 1 美元money 减少 children

此时如果 money < 0,则表示无法所有人都至少分配到 1 美元,返回 -1 。

然后依次再给每个人分配 7 美元,最多可以分给 cnt 个人: $$ cnt = min(⌊money/7⌋, children) $$ 更新剩余 money 和剩余没分配到 8 美元的人数,有以下几种情况:

  • 剩余 0 人,且 money > 0,则把剩余的钱全部给一个人,cnt – 1.
  • 剩余 1 人,且 money = 3,如果把剩余的钱给他,则他分到了 4 美元,为了避免这种情况,不给他,给一个分到 8 美元的人,cnt – 1.
  • 其余情况,剩余的钱全部给一个人,如果他恰好分到 4 美元,给其他一人 1 美元,cnt 不变。

代码实现:

class Solution {
    public int distMoney(int money, int children) {
        money -= children; // 先给每人分配一美元
        if(money < 0)return -1;
        int cnt = Math.min(money / 7, children); // 让尽量多的人分到8美元
        money -= cnt * 7;
        children -= cnt;
        if(children == 0 && money > 0 || // 每个人都分了8美元,剩下的全给一人
           children == 1 && money == 3){ // 有一人分到了4美元
            cnt--;
        }
        return cnt;
    }
}

复杂度分析:

时间复杂度: O(1)

空间复杂度: O(1)

相关链接

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇