📜  巧克力分配问题的 C++ 程序

📅  最后修改于: 2022-05-13 01:56:08.234000             🧑  作者: Mango

巧克力分配问题的 C++ 程序

给定一个包含 n 个整数的数组,其中每个值代表一包中巧克力的数量。每个包可以有不定数量的巧克力。有 m 个学生,任务是分发巧克力包,这样:

  1. 每个学生得到一包。
  2. 给学生的巧克力包中的巧克力数量与巧克力数量之差最小。

例子:

来源: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),因为我们在子数组搜索之前应用排序。

请参阅有关巧克力分配问题的完整文章以获取更多详细信息!