巧克力分配问题的 C++ 程序
给定一个包含 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 的子数组,其中最后一个元素和第一个元素之间的差异最小。
下图是上述方法的试运行:
下面是上述方法的实现:
C++
// C++ program to solve chocolate
// distribution problem
#include
using namespace std;
// arr[0..n-1] represents sizes of packets
// m is number of students.
// Returns minimum difference between maximum
// and minimum values of distribution.
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
sort(arr, arr + n);
// Number of students cannot be more than
// number of packets
if (n < m)
return -1;
// Largest number of chocolates
int min_diff = INT_MAX;
// 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
int main()
{
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 = sizeof(arr) / sizeof(arr[0]);
cout << "Minimum difference is " <<
findMinDiff(arr, n, m);
return 0;
}
输出:最小差异为 10
时间复杂度: O(n Log n),因为我们在子数组搜索之前应用排序。
请参阅有关巧克力分配问题的完整文章以获取更多详细信息!