📌  相关文章
📜  通过从两个数组中依次选择元素来获得最大和

📅  最后修改于: 2021-04-27 17:46:13             🧑  作者: Mango

给定两个大小为N的数组以及两个整数XY,分别表示一个人可以分别从数组A和数组B中选取的最大元素数。
在每个i圈,都可以选择A [i]B [i] 。任务是进行选择,以使可能的总和达到最大。
注意:保证(X + Y)≥N

例子:

方法:使用贪婪方法选择将导致最大总和的元素。以下步骤将有助于解决此问题:

  • 根据绝对差对元素对进行排序,即| A [i] – B [i] |以降序排列。
  • 比较A [i]B [i]的值,取较大者将该值加到sum上
  • 如果从A [i]中选择元素,则将X减1,否则将Y减1。
  • 最后打印总和

下面是上述方法的实现:

// Java program to calculate the
// maximum sum obtained by making an
// Optimal selection of elements from two given arrays
  
import java.io.*;
import java.util.*;
import java.lang.*;
  
// User defined Pair class
class Pair {
    int x;
    int y;
  
    // Constructor
    public Pair(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}
  
// Class to define user defined comparator
class Compare {
  
    // Function to reverse the elements of an array
    static void reverseArray(Pair[] arr, int start, int end)
    {
  
        int tempx, tempy;
        while (start < end) {
            tempx = arr[start].x;
            tempy = arr[start].y;
            arr[start].x = arr[end].x;
            arr[start].y = arr[end].y;
            arr[end].x = tempx;
            arr[end].y = tempy;
            start++;
            end--;
        }
    }
  
    // Function to sort the pair according to the
    // absolute differences
    static Pair[] compare(Pair[] arr, int N)
    {
  
        // Comparator to sort the pair according to 
        // the absolute differences
        Arrays.sort(arr, new Comparator() {
            @Override
            public int compare(Pair p1, Pair p2)
            {
                return (Math.abs(p1.x - p1.y) - Math.abs(p2.x - p2.y));
            }
        });
  
        // To get in descending order
        reverseArray(arr, 0, N - 1);
        return arr;
    }
}
  
// Driver class
class GFG {
  
    // Function to calculate the
    // maximum possible sum obtained by making an
    // optimal selection elements from two given arrays
  
    static int getMaximumSum(int[] A, int[] B, int N,
                                        int X, int Y)
    {
        int num1, num2, sum = 0;
  
        // Making a single pair array having
        // arr[i] element as (Ai, Bi)
        Pair[] arr = new Pair[N];
        for (int i = 0; i < N; i++) {
            arr[i] = new Pair(A[i], B[i]);
        }
  
        // Sorting according to the absolute differences
        // in the decreasing order
        Compare obj = new Compare();
        obj.compare(arr, N);
  
        // Applying Greedy approach to make an optimal 
        // selection
        for (int i = 0; i < N; i++) {
            num1 = arr[i].x;
            num2 = arr[i].y;
  
            // If A[i] > B[i]
            if (num1 > num2) {
  
                // If element from A can be picked
                if (X > 0) {
                    sum += num1;
                    X--;
                }
  
                // Insufficient X
                // Make a pick from B
                else if (Y > 0) {
                    sum += num2;
                    Y--;
                }
            }
  
            // If B[i] > A[i]
            else if (num2 > num1 && Y > 0) {
  
                // If element from B can be picked
                if (Y > 0) {
                    sum += num2;
                    Y--;
                }
  
                // Insufficient Y
                // Make a pick from A
                else {
                    sum += num1;
                    X--;
                }
            }
  
            // If A[i] = B[i]
            // Doesn't make a difference so any value 
            //  can be picked
            else {
                sum += num1;
                if (X > 0) {
                    X--;
                }
                else if (Y > 0)
                    Y--;
            }
        }
        return sum;
    }
  
    // Driver code
    public static void main(String args[])
    {
        int X = 3, Y = 2;
        int[] A = { 1, 2, 3, 4, 5 };
        int[] B = { 5, 4, 3, 2, 1 };
        int N = A.length;
        System.out.println(getMaximumSum(A, B, N, X, Y));
    }
}
输出:
21