问题描述
小M从商店买了两种糖果,第一种有 aa 个,第二种有 bb 个。现在她想要将这些糖果分给班上的 nn 个小朋友,分配需要遵循以下规则:
- 每个小朋友必须且只能得到一种糖果(不能同时得到两种糖果)
- 每个小朋友至少要得到一个糖果
- 每种糖果至少要分给一个小朋友
- 为了尽可能公平,小M希望分到糖果最少的小朋友能得到尽可能多的糖果
请你帮助小M计算:在满足上述所有条件的前提下,分到糖果最少的小朋友最多能得到多少个糖果?
输入格式
- 输入包含三个整数 n, a, b
- 其中 n 表示小朋友的数量,a 和 b 分别表示两种糖果的数量
- 保证 1≤n≤10^5,1≤a,b≤10^5
输出格式
- 输出一个整数,表示在最优分配方案下,得到糖果最少的小朋友能得到的最大糖果数
- 如果无法按要求分配,输出 0
解题思路
-
理解问题:我们需要将两种糖果分配给
n个小朋友,每个小朋友只能得到一种糖果,并且每种糖果至少要分给一个小朋友。目标是使得分到糖果最少的小朋友能得到尽可能多的糖果。 -
数据结构选择:我们可以使用一个变量来记录当前分配方案下,分到糖果最少的小朋友的糖果数。
-
算法步骤:
- 从可能的最大值开始尝试分配,逐步减少这个值,直到找到一个可行的分配方案。
- 对于每个尝试的值
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);
}
}
关键步骤解释
-
solution方法:- 从可能的最大值
maxCandies开始尝试分配。 - 使用
canDistribute方法检查是否可以分配。
- 从可能的最大值
-
canDistribute方法:- 计算需要分配的糖果总数
totalCandiesNeeded。 - 检查是否有足够的糖果来满足分配条件。
- 计算需要分配的糖果总数
提示
- 你可以进一步优化
canDistribute方法,考虑如何更高效地检查分配条件。 - 确保在
canDistribute方法中正确处理边界情况,例如a或b小于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了一下是能通过的,逻辑有的没懂