题目解析:小C的糖果分配问题 | 豆包MarsCode AI 刷题

127 阅读2分钟

豆包MarsCode177 小C的糖果分配问题

问题描述

小C有一堆糖果,总共有nn颗。她需要将糖果分给小朋友们,每个小朋友的糖果数量必须在llrr之间。她想知道,在满足这些条件的前提下,最少可以分给多少个小朋友,最多可以分给多少个小朋友。如果糖果无法正好分完,返回-1


测试样例

样例1:

输入:n = 10, l = 2, r = 3 输出:[4, 5]

样例2:

输入:n = 7, l = 3, r = 5 输出:[2, 2]

样例3:

输入:n = 8, l = 1, r = 4 输出:[2, 8]


minChildren=nr\text{minChildren} = \lceil \frac{n}{r} \rceil

解题步骤

  1. 最小小朋友数量

    • 最少的小朋友数量应该是将糖果 n 除以最大糖果数 r 后向上取整,即minChildren=nr\text{minChildren} = \lceil \frac{n}{r} \rceil。这是因为如果我们希望分给尽量少的小朋友,我们需要将糖果分配给每个小朋友最多的糖果数量 r
  2. 最大小朋友数量

    • 为了最大化小朋友数量,应该是将糖果 n 除以最小糖果数 l 后向下取整,即maxChildren=nl\text{maxChildren} = \left\lfloor \frac{n}{l} \right\rfloor。这是因为如果我们希望分给尽量多的小朋友,我们需要将糖果分配给每个小朋友最少的糖果数量 l
  3. 判断是否能够正好分配糖果

    • 如果min_friends * l > n,即使每个小朋友都分得最少的糖果数l,糖果也不够分,返回-1。如果 max_friends * r < n,即使每个小朋友都分得最多的糖果数r,糖果也分不完,返回-1。

代码实现

import java.util.Arrays;

public class Main {

    public static int[] solution(int n, int l, int r) {
        // 计算最小和最大小朋友数量
        int minChildren = (int) Math.ceil((double) n / r);
        int maxChildren = n / l;

        // 如果无法分配糖果
        if (minChildren * l > n || maxChildren * r < n) {
            return new int[] {-1};
        }
        
        // 返回最小和最大小朋友数量
        return new int[] { minChildren, maxChildren };
    }

    public static void main(String[] args) {
        System.out.println(Arrays.equals(solution(10, 2, 3), new int[] { 4, 5 }));
        System.out.println(Arrays.equals(solution(7, 3, 5), new int[] { 2, 2 }));
        System.out.println(Arrays.equals(solution(8, 1, 4), new int[] { 2, 8 }));
    }
}

代码解释

  1. 输入参数

    • n:糖果的总数。
    • l:每个小朋友糖果的最小数目。
    • r:每个小朋友糖果的最大数目。
  2. 计算最小和最大小朋友数量

    • minChildren 通过 Math.ceil((double)n / r) 计算,表示最少小朋友数量。
    • maxChildren 通过 n / l 计算,表示最多小朋友数量。
  3. 判断是否能正好分配

    • 使用条件判断 minChildren * l > n || maxChildren * r < n 来确认是否无法正好分配糖果,如果不能分配则返回 -1

复杂度分析

  • 时间复杂度:O(1)。计算最小和最大小朋友数量,以及判断糖果是否能正好分配都是常数时间操作。
  • 空间复杂度:O(1)。只使用了常数空间来存储结果。