巧克力分配问题的Java程序
给定一个包含 n 个整数的数组,其中每个值代表一包中巧克力的数量。每个包可以有不定数量的巧克力。有 m 个学生,任务是分发巧克力包,这样:
- 每个学生得到一包。
- 给学生的巧克力包中的巧克力数量与巧克力数量之差最小。
例子:
Input : arr[] = {7, 3, 2, 4, 9, 12, 56} , m = 3
Output: Minimum Difference is 2
Explanation:
We have seven packets of chocolates and
we need to pick three packets for 3 students
If we pick 2, 3 and 4, we get the minimum
difference between maximum and minimum packet
sizes.
Input : arr[] = {3, 4, 1, 9, 56, 7, 9, 12} , m = 5
Output: Minimum Difference is 6
Explanation:
The set goes like 3,4,7,9,9 and the output
is 9-3 = 6
Input : arr[] = {12, 4, 7, 9, 2, 23, 25, 41,
30, 40, 28, 42, 30, 44, 48,
43, 50} , m = 7
Output: Minimum Difference is 10
Explanation:
We need to pick 7 packets. We pick 40, 41,
42, 44, 48, 43 and 50 to minimize difference
between maximum and minimum.
来源:Flipkart 面试经历
一个简单的解决方案是生成 arr[0..n-1] 的所有大小为 m 的子集。对于每个子集,找出其中最大和最小元素之间的差异。最后,返回最小差值。
一个有效的解决方案是基于这样的观察,即为了最小化差异,我们必须从排序的数据包中选择连续的元素。我们首先对数组 arr[0..n-1] 进行排序,然后找到大小为 m 的子数组,其中最后一个元素和第一个元素之间的差异最小。
下图是上述方法的试运行:
下面是上述方法的实现:
Java
// Java program for Chocolate Distribution
// problem
import java.util.*;
class GFG {
// arr[0..n-1] represents sizes of
// packets. m is number of students.
// Returns minimum difference between
// maximum and minimum values of
// distribution.
static int findMinDiff(int arr[],
int n, int m)
{
// If there are no chocolates or
// number of students is 0
if (m == 0 || n == 0)
return 0;
// Sort the given packets
Arrays.sort(arr);
// Number of students cannot be
// more than number of packets
if (n < m)
return -1;
// Largest number of chocolates
int min_diff = Integer.MAX_VALUE;
// Find the subarray of size m
// such that difference between
// last (maximum in case of
// sorted) and first (minimum in
// case of sorted) elements of
// subarray is minimum.
for (int i = 0; i + m - 1 < n; i++)
{
int diff = arr[i+m-1] - arr[i];
if (diff < min_diff)
min_diff = diff;
}
return min_diff;
}
// Driver code
public static void main(String[] args)
{
int arr[] = {12, 4, 7, 9, 2, 23,
25, 41, 30, 40, 28,
42, 30, 44, 48, 43,
50};
// Number of students
int m = 7;
int n = arr.length;
System.out.println(
"Minimum difference is " +
findMinDiff(arr, n, m));
}
}
// This code is contributed by Arnav Kr. Mandal.
输出:
Minimum difference is 10
时间复杂度: O(n Log n),因为我们在子数组搜索之前应用排序。
请参阅有关巧克力分配问题的完整文章以获取更多详细信息!