📜  巧克力分配问题的Java程序

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

巧克力分配问题的Java程序

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

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

例子:

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

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