给定两个数组A []和B [] ,每个数组分别由N个整数和整数K组成,任务是重新排列数组B [] ,以使A i + B i的总和最大为K。如果没有这种安排,请打印-1 。
例子:
Input: A[] = {1, 2, 3, 4, 2}, B[] = {1, 2, 3, 1, 1}, K = 5
Output: 1 3 1 1 2
Input: A[] = {1, 2, 3, 4, 5}, B[] = {2, 3, 4, 5, 6}, K = 6
Output: -1
方法:满足给定条件的数组B []的最佳重新排列是按降序对数组进行排序。
证明:
- Since the sum of every pair of ith indexed elements can be atmost K. Therefore, mn + num ≤ X and mx + num1 ≤ X, where mn and mx are the minimum elements in the array A[] and B[] respectively.
- Therefore, by induction, it can be proved that mn and mx can be paired.
- Therefore, sorting the array in descending order is the most optimal rearrangement
请按照以下步骤解决问题:
- 按降序对数组B []进行排序。
- 遍历数组,并检查每个第i个索引的A i + B i是否小于或等于K。
- 如果任何一对条件均失败,则打印-1 。
- 否则,打印数组B []
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to rearrange array such
// that sum of similar indexed elements
// does not exceed K
void rearrangeArray(int A[], int B[],
int N, int K)
{
// Sort the array B[]
// in descending order
sort(B, B + N, greater());
bool flag = true;
for (int i = 0; i < N; i++) {
// If conditon fails
if (A[i] + B[i] > K) {
flag = false;
break;
}
}
if (!flag) {
cout << "-1" << endl;
}
else {
// Print the array
for (int i = 0; i < N; i++) {
cout << B[i] << " ";
}
}
}
// Driver Code
int main()
{
// Given arrays
int A[] = { 1, 2, 3, 4, 2 };
int B[] = { 1, 2, 3, 1, 1 };
int N = sizeof(A) / sizeof(A[0]);
int K = 5;
rearrangeArray(A, B, N, K);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Reverse array
static int[] reverse(int a[])
{
int i, n = a.length, t;
for(i = 0; i < n / 2; i++)
{
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
return a;
}
// Function to rearrange array such
// that sum of similar indexed elements
// does not exceed K
static void rearrangeArray(int A[], int B[],
int N, int K)
{
// Sort the array B[]
// in descending order
Arrays.sort(B);
B = reverse(B);
boolean flag = true;
for(int i = 0; i < N; i++)
{
// If conditon fails
if (A[i] + B[i] > K)
{
flag = false;
break;
}
}
if (!flag)
{
System.out.print("-1" + "\n");
}
else
{
// Print the array
for(int i = 0; i < N; i++)
{
System.out.print(B[i] + " ");
}
}
}
// Driver Code
public static void main(String[] args)
{
// Given arrays
int A[] = { 1, 2, 3, 4, 2 };
int B[] = { 1, 2, 3, 1, 1 };
int N = A.length;
int K = 5;
rearrangeArray(A, B, N, K);
}
}
// This code is contributed by Amit Katiyar
Python3
# Python3 program for the above approach
# Function to rearrange array such
# that sum of similar indexed elements
# does not exceed K
def rearrangeArray(A, B, N, K):
# Sort the array B[]
# in descending order
B.sort(reverse = True)
flag = True
for i in range(N):
# If conditon fails
if (A[i] + B[i] > K):
flag = False
break
if (flag == False):
print("-1")
else:
# Print the array
for i in range(N):
print(B[i], end = " ")
# Driver Code
if __name__ == '__main__':
# Given arrays
A = [ 1, 2, 3, 4, 2 ]
B = [ 1, 2, 3, 1, 1 ]
N = len(A)
K = 5;
rearrangeArray(A, B, N, K)
# This code is contributed by SURENDRA_GANGWAR
C#
// C# program for the
// above approach
using System;
class GFG{
// Reverse array
static int[] reverse(int []a)
{
int i, n = a.Length, t;
for(i = 0; i < n / 2; i++)
{
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
return a;
}
// Function to rearrange array such
// that sum of similar indexed elements
// does not exceed K
static void rearrangeArray(int []A, int []B,
int N, int K)
{
// Sort the array []B
// in descending order
Array.Sort(B);
B = reverse(B);
bool flag = true;
for(int i = 0; i < N; i++)
{
// If conditon fails
if (A[i] + B[i] > K)
{
flag = false;
break;
}
}
if (!flag)
{
Console.Write("-1" + "\n");
}
else
{
// Print the array
for(int i = 0; i < N; i++)
{
Console.Write(B[i] + " ");
}
}
}
// Driver Code
public static void Main(String[] args)
{
// Given arrays
int []A = {1, 2, 3, 4, 2};
int []B = {1, 2, 3, 1, 1};
int N = A.Length;
int K = 5;
rearrangeArray(A, B, N, K);
}
}
// This code is contributed by Rajput-Ji
输出:
3 2 1 1 1
时间复杂度: O(N)
辅助空间复杂度: O(1)