跳转至

2591. 将钱分给最多的儿童

题目描述

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

解法

方法一:分类讨论

如果 $money \lt children$,那么一定存在儿童没有分到钱,返回 $-1$。

如果 $money \gt 8 \times children$,那么有 $children-1$ 个儿童获得了 $8$ 美元,剩下的一个儿童获得了 $money - 8 \times (children-1)$ 美元,返回 $children-1$。

如果 $money = 8 \times children - 4$,那么有 $children-2$ 个儿童获得了 $8$ 美元,剩下的两个儿童分摊剩下的 $12$ 美元(只要不是 $4$, $8$ 美元就行),返回 $children-2$。

如果,我们假设有 $x$ 个儿童获得了 $8$ 美元,那么剩下的钱为 $money- 8 \times x$,只要保证大于等于剩下的儿童数 $children-x$,就可以满足题意。因此,我们只需要求出 $x$ 的最大值,即为答案。

时间复杂度 $O(1)$,空间复杂度 $O(1)$。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution:
    def distMoney(self, money: int, children: int) -> int:
        if money < children:
            return -1
        if money > 8 * children:
            return children - 1
        if money == 8 * children - 4:
            return children - 2
        # money-8x >= children-x, x <= (money-children)/7
        return (money - children) // 7
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Solution {
    public int distMoney(int money, int children) {
        if (money < children) {
            return -1;
        }
        if (money > 8 * children) {
            return children - 1;
        }
        if (money == 8 * children - 4) {
            return children - 2;
        }
        // money-8x >= children-x, x <= (money-children)/7
        return (money - children) / 7;
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Solution {
public:
    int distMoney(int money, int children) {
        if (money < children) {
            return -1;
        }
        if (money > 8 * children) {
            return children - 1;
        }
        if (money == 8 * children - 4) {
            return children - 2;
        }
        // money-8x >= children-x, x <= (money-children)/7
        return (money - children) / 7;
    }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func distMoney(money int, children int) int {
    if money < children {
        return -1
    }
    if money > 8*children {
        return children - 1
    }
    if money == 8*children-4 {
        return children - 2
    }
    // money-8x >= children-x, x <= (money-children)/7
    return (money - children) / 7
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function distMoney(money: number, children: number): number {
    if (money < children) {
        return -1;
    }
    if (money > 8 * children) {
        return children - 1;
    }
    if (money === 8 * children - 4) {
        return children - 2;
    }
    return Math.floor((money - children) / 7);
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
impl Solution {
    pub fn dist_money(money: i32, children: i32) -> i32 {
        if money < children {
            return -1;
        }

        if money > children * 8 {
            return children - 1;
        }

        if money == children * 8 - 4 {
            return children - 2;
        }

        (money - children) / 7
    }
}

评论