📌  相关文章
📜  通过从给定的 N 对中选择 N 个数字获得的最小和

📅  最后修改于: 2021-09-02 07:30:48             🧑  作者: Mango

给定一个由N对整数(A, B) 组成的数组 arr[] ,其中N是偶数,任务是找到选择N 个元素的最小和,使得从所有对中准确选择值 AB (N/2 )次。

例子:

方法:这个问题可以使用贪心方法来解决。以下是步骤:

  1. 对于给定数组中的每一对(A, B) ,将 (B – A)的值与临时数组中的相应索引一起存储(比如temp[] )。值(B – A)实际上定义了如果为每个元素选择 A 而不是 B 时最小化的成本。
  2. 目标是最小化总成本。因此,按降序对数组 temp[]进行排序。
  3. 通过选择一个拾取从阵列临时[]第一N / 2个元素作为当选择了在B A第一N / 2个元素将具有最大总和。
  4. 对于剩余的N/2 个元素,选择B,因为值的总和可以最小化。

下面是上述方法的实现:

// C++ program for the above approach
#include 
using namespace std;
  
// Function to choose the elements A
// and B such the sum of all elements
// is minimum
int minSum(int arr[][2], int n)
{
  
    // Create an array of pair to
    // store Savings and index
    pair temp[n];
  
    // Traverse the given array of pairs
    for (int i = 0; i < 2 * n; i++) {
  
        // Sum minimized when A
        // is chosen over B for
        // i-th element.
        temp[i].first = arr[i][1]
                        - arr[i][0];
  
        // Store index for the
        // future reference.
        temp[i].second = i;
    }
  
    // Sort savings array in
    // non-increasing order.
    sort(temp, temp + 2 * n,
         greater >());
  
    // Storing result
    int res = 0;
  
    for (int i = 0; i < 2 * n; i++) {
  
        // First n elements choose
        // A and rest choose B
        if (i < n)
            res += arr[temp[i].second][0];
        else
            res += arr[temp[i].second][1];
    }
  
    // Return the final Sum
    return res;
}
  
// Driver Code
int main()
{
    // Given array of pairs
    int arr[4][2] = { { 7, 20 },
                      { 300, 50 },
                      { 30, 200 },
                      { 30, 20 } };
  
    // Function Call
    cout << minSum(arr, 2);
}
输出:
107

时间复杂度: O(N*log(N))
辅助空间复杂度: O(N)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live