问题描述
小M从商店买了两种糖果,第一种有 aa 个,第二种有 bb 个。现在她想要将这些糖果分给班上的 nn 个小朋友,分配需要遵循以下规则:
- 每个小朋友必须且只能得到一种糖果(不能同时得到两种糖果)
- 每个小朋友至少要得到一个糖果
- 每种糖果至少要分给一个小朋友
- 为了尽可能公平,小M希望分到糖果最少的小朋友能得到尽可能多的糖果
请你帮助小M计算:在满足上述所有条件的前提下,分到糖果最少的小朋友最多能得到多少个糖果?
输入格式
- 输入包含三个整数 nn, aa, bb
- 其中 nn 表示小朋友的数量,aa 和 bb 分别表示两种糖果的数量
- 保证 1≤n≤1051≤n≤105,1≤a,b≤1051≤a,b≤105
输出格式
- 输出一个整数,表示在最优分配方案下,得到糖果最少的小朋友能得到的最大糖果数
- 如果无法按要求分配,输出 0
测试样例
样例1:
输入:
n = 5, a = 2, b = 3
输出:1
解释:可以给 2 个小朋友每人分 1 个第一种糖果,给 3 个小朋友每人分 1 个第二种糖果
题目分析
- 最小糖果数量:每个小朋友至少要得到一个糖果,因此我们需要确保每种糖果至少分给一个小朋友。
- 最大化最少糖果数量:为了尽可能公平,我们希望分到糖果最少的小朋友能得到尽可能多的糖果。
解题思路
- 确定最大可能的糖果数量:我们可以分配的最大糖果数量是两种糖果数量的最小值,即 (min(a, b))。
- 逐步检查可行性:从最大可能的糖果数量开始,逐步减少,检查是否可以满足所有小朋友的需求。
- 计算可分配的糖果数量:对于每个可能的糖果数量 ,计算可以分配给小朋友的总数。如果总数大于或等于 (n),则更新结果。
详细解释
- 初始化最大糖果数量:maxCandies 设为 (min(a, b))。
- 循环检查:从 1 到 maxCandies,逐步检查每个可能的糖果数量 (i)。 3计算总数:对于每个 (i),计算可以分配的总糖果数 count。
- 更新结果:如果 count 大于或等于 (n),则更新结果 res 为当前的 (i)。
具体代码:
public static int solution(int n, int a, int b) {
int maxCandies = Math.min(a, b);
int res = 0;
for (int i = 1; i <= maxCandies; i++) {
int count = a / i + b / i;
if (count >= n) {
res = i;
}
}
return res;
}
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);
}
}