给定两个大小为N 的数组和两个整数X和Y,分别表示可以从数组 A和数组B 中选择的最大元素数。
在每个第i个回合,可以选择A[i]或B[i] 。任务是做出产生最大可能总和的选择。
注意:保证(X + Y) ≥ N 。
例子:
Input: A[] = {1, 2, 3, 4, 5}, B[] = {5, 4, 3, 2, 1}, X = 3, Y = 2
Output: 21
i = 0 -> 5 picked
i = 1 -> 4 picked
i = 2 -> 3 picked
i = 3 -> 4 picked
i = 4 -> 5 picked
5 + 4 + 3 + 4 + 5 = 21
Input: A[] = {1, 4, 3, 2, 7, 5, 9, 6}, B[] = {1, 2, 3, 6, 5, 4, 9, 8}, X = 4, Y = 4
Output: 43
方法:使用贪心方法选择将导致最大和的元素。以下步骤将有助于解决此问题:
- 根据绝对差值对元素对进行排序,即|A[i] – B[i]|按降序排列。
- 比较A[i]和B[i]值,较大者将该值添加到总和中。
- 如果元素是从A[i] 中选择的,则将 X减一,否则将Y 减一。
- 最后打印总和。
下面是上述方法的实现:
// 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