📌  相关文章
📜  对的绝对差的最小和最大和

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

对的绝对差的最小和最大和

给定一个 N 个整数数组,其中 N 是偶数,求 N/2 对的绝对差的最小和最大和,该对是通过将每个元素与另一个元素配对形成的。

例子:

Input: a[] = {10, -10, 20, -40} 
Output: min_sum = 40, max_sum = 80
Explanation: Pairs selected for minimum sum 
             (-10, -40) and (10, 20) 
             min_sum = |-10 - -40| + |20 - 10| = 40 
             Pairs selected for maximum sum 
             (-10, 20) and (-40, 10) 
             max_sum = |-10 - 20| + |10 - -40| = 80

Input: a[] = {20, -10, -1, 30} 
Output: min_sum = 19, max_sum = 61 
Explanation: Pairs selected for minimum sum
             (-1, -10) and (20, 30) 
             min_sum = |-1 - -10| + |20 - 30| = 19 
             Pairs selected for maximum sum
             (-1, 30) and (-10, 20) 
             max_sum = |-1 - 30| + |-10 - 20| = 61 

方法:
最常见的观察是,对于差异的最小和,我们需要最接近的元素作为一对,而对于最大的和,我们需要最远的元素作为一对。因此,我们可以简单地对给定的元素列表进行排序,最接近的对将是 a[i]、a[i+1],它们的绝对差和将为我们得出最小和。最远的将是 (a[0], a[n-1]) 和 (a[1], a[n-2]) 等等,它们的绝对差和将为我们得出最大和。

C++
// CPP program to find minimum and maximum
// sum of absolute differences of pairs
#include 
using namespace std;
 
// function to calculate minimum sum
int calculate_min_sum(int a[], int n)
{
    // sorts the array c++ stl
    sort(a, a + n);
 
    // initially min=0 and max=0
    int min_sum = 0;
 
    // traverse to find the minimum sum
    for (int i = 1; i < n; i += 2) {
 
        // the adjacent elements difference
        // will always be smaller
        min_sum += abs(a[i] - a[i - 1]);
    }
    return min_sum;
}
 
// function to calculate maximum sum
int calculate_max_sum(int a[], int n)
{
    // sorts the array c++ stl
    sort(a, a + n);
 
    int max_sum = 0;
 
    // traverse to find the maximum sum
    for (int i = 0; i < n / 2; i++) {
         
        // the farthest distant elements sum
        // will always be maximum
        max_sum += abs(a[n - 1 - i] - a[i]);
    }
    return max_sum;
}
 
// Driver program to test above function
int main()
{
    int a[] = { 10, -10, 20, -40};
 
    int n = sizeof(a) / sizeof(a[0]);
 
    cout << "The minimum sum of pairs is "
         << calculate_min_sum(a, n) << endl;
 
    cout << "The maximum sum of pairs is "
         << calculate_max_sum(a, n) << endl;
 
    return 0;
}


Java
// Java program to find minimum and maximum
// sum of absolute differences of pairs
import java.util.Arrays;
 
class GFG
{
    // function to calculate minimum sum
    static int calculate_min_sum(int[] a, int n)
    {
        // sorts the array c++ stl
        Arrays.sort(a);
 
        // initially min=0 and max=0
        int min_sum = 0;
 
        // traverse to find the minimum sum
        for (int i = 1; i < n; i += 2) {
 
            // the adjacent elements difference
            // will always be smaller
            min_sum += Math.abs(a[i] - a[i - 1]);
        }
        return min_sum;
    }
 
    // function to calculate maximum sum
    static int calculate_max_sum(int[] a, int n)
    {
        // sorts the array c++ stl
        Arrays.sort(a);
 
        int max_sum = 0;
 
        // traverse to find the maximum sum
        for (int i = 0; i < n / 2; i++) {
         
            // the farthest distant elements sum
            // will always be maximum
            max_sum += Math.abs(a[n - 1 - i] - a[i]);
        }
        return max_sum;
    }
 
    // Driver program to test above function   
    public static void main (String[] args) {
    int[] a = { 10, -10, 20, -40};
 
    int n = a.length;
     
    System.out.println("The minimum sum of pairs is " +
                          calculate_min_sum(a, n));
 
    System.out.println("The maximum sum of pairs is " +
                           calculate_max_sum(a, n));
     
    }
}
 
/* This code is contributed by Mr. Somesh Awasthi */


Python3
# Python 3 program to find minimum and maximum
# sum of absolute differences of pairs
 
# function to calculate minimum sum
def calculate_min_sum( a, n):
 
    # sorts the array c++ stl
    a.sort()
 
    # initially min=0 and max=0
    min_sum = 0
 
    # traverse to find the minimum sum
    for i in range(1, n, 2):
 
        # the adjacent elements difference
        # will always be smaller
        min_sum += abs(a[i] - a[i - 1])
     
    return min_sum
 
# function to calculate maximum sum
def calculate_max_sum(a, n):
 
    # sorts the array c++ stl
    a.sort()
 
    max_sum = 0
 
    # traverse to find the maximum sum
    for i in range(n // 2):
         
        # the farthest distant elements sum
        max_sum += abs(a[n - 1 - i] - a[i])
    return max_sum
 
# Driver Code
if __name__ == "__main__":
     
    a = [ 10, -10, 20, -40]
 
    n = len(a)
 
    print("The minimum sum of pairs is",
                calculate_min_sum(a, n))
 
    print( "The maximum sum of pairs is",
                 calculate_max_sum(a, n))
 
# This code is contributed by ita_c


C#
// C# program to find minimum and maximum
// sum of absolute differences of pairs
using System;
 
class GFG
{
    // function to calculate minimum sum
    static int calculate_min_sum(int []a, int n)
    {
        // sorts the array c++ stl
        Array.Sort(a);
 
        // initially min=0 and max=0
        int min_sum = 0;
 
        // traverse to find the minimum sum
        for (int i = 1; i < n; i += 2) {
 
            // the adjacent elements difference
            // will always be smaller
            min_sum += Math.Abs(a[i] - a[i - 1]);
        }
        return min_sum;
    }
 
    // Function to calculate maximum sum
    static int calculate_max_sum(int []a, int n)
    {
        // sorts the array c++ stl
        Array.Sort(a);
 
        int max_sum = 0;
 
        // Traverse to find the maximum sum
        for (int i = 0; i < n / 2; i++) {
         
            // the farthest distant elements sum
            // will always be maximum
            max_sum += Math.Abs(a[n - 1 - i] - a[i]);
        }
        return max_sum;
    }
 
    // Driver Code
    public static void Main ()
    {
    int []a = { 10, -10, 20, -40};
 
    int n = a.Length;
     
    Console.WriteLine("The minimum sum of pairs is " +
                            calculate_min_sum(a, n));
 
    Console.Write("The maximum sum of pairs is " +
                         calculate_max_sum(a, n));
     
    }
}
 
// This code is contributed by nitin mittal.


PHP


Javascript


输出:

The minimum sum of pairs is 40
The maximum sum of pairs is 80

时间复杂度: O(n log n)