糖果均匀分配问题|豆包MarsCode Al刷题

161 阅读3分钟

问题描述

小M从商店买了两种糖果,第一种有 aa 个,第二种有 bb 个。现在她想要将这些糖果分给班上的 nn 个小朋友,分配需要遵循以下规则:

  1. 每个小朋友必须且只能得到一种糖果(不能同时得到两种糖果)
  2. 每个小朋友至少要得到一个糖果
  3. 每种糖果至少要分给一个小朋友
  4. 为了尽可能公平,小M希望分到糖果最少的小朋友能得到尽可能多的糖果

请你帮助小M计算:在满足上述所有条件的前提下,分到糖果最少的小朋友最多能得到多少个糖果?

输入格式

  • 输入包含三个整数 n, a, b
  • 其中 n 表示小朋友的数量,a 和 b 分别表示两种糖果的数量
  • 保证 1≤n≤10^5,1≤a,b≤10^5

输出格式

  • 输出一个整数,表示在最优分配方案下,得到糖果最少的小朋友能得到的最大糖果数
  • 如果无法按要求分配,输出 0

解题思路

  1. 理解问题:我们需要将两种糖果分配给 n 个小朋友,每个小朋友只能得到一种糖果,并且每种糖果至少要分给一个小朋友。目标是使得分到糖果最少的小朋友能得到尽可能多的糖果。

  2. 数据结构选择:我们可以使用一个变量来记录当前分配方案下,分到糖果最少的小朋友的糖果数。

  3. 算法步骤

    • 从可能的最大值开始尝试分配,逐步减少这个值,直到找到一个可行的分配方案。
    • 对于每个尝试的值 k,检查是否可以将糖果分配给 n 个小朋友,使得每个小朋友至少得到 k 个糖果。
    • 如果可以分配,则 k 是当前最优解,继续尝试更大的 k
    • 如果不能分配,则减少 k 并重新尝试。

代码提示

public class Main {
    public static int solution(int n, int a, int b) {
        // 从可能的最大值开始尝试分配
        int maxCandies = Math.min(a, b);
        for (int k = maxCandies; k > 0; k--) {
            // 检查是否可以将糖果分配给 n 个小朋友,使得每个小朋友至少得到 k 个糖果
            if (canDistribute(n, a, b, k)) {
                return k;
            }
        }
        return 0;
    }

    // 检查是否可以将糖果分配给 n 个小朋友,使得每个小朋友至少得到 k 个糖果
    private static boolean canDistribute(int n, int a, int b, int k) {
        // 计算需要分配的糖果总数
        int totalCandiesNeeded = n * k;
        // 检查是否有足够的糖果
        if (a / k + b / k >= n) {
            return true;
        }
        return false;
    }

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

关键步骤解释

  1. solution 方法

    • 从可能的最大值 maxCandies 开始尝试分配。
    • 使用 canDistribute 方法检查是否可以分配。
  2. canDistribute 方法

    • 计算需要分配的糖果总数 totalCandiesNeeded
    • 检查是否有足够的糖果来满足分配条件。

提示

  • 你可以进一步优化 canDistribute 方法,考虑如何更高效地检查分配条件。
  • 确保在 canDistribute 方法中正确处理边界情况,例如 ab 小于 k 的情况。

代码部分

public class Main {
    public static int solution(int n, int a, int b) {
        int maxCandies = Math.min(a, b);
        for (int k = maxCandies; k > 0; k--) {
            if (canDistribute(n, a, b, k)) {
                return k;
            }
        }
        return 0;
    }
    
    private static boolean canDistribute(int n, int a, int b, int k) {
        if (a / k + b / k >= n) {
            return true;
        }
        return false;
    }

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

ai给的参考代码,run了一下是能通过的,逻辑有的没懂

image.png