📜  覆盖给定范围所需的最小对数

📅  最后修改于: 2021-10-26 07:01:25             🧑  作者: Mango

给定一个由N对和一个正整数K组成的数组 arr[] ,任务是选择最小数量的对,使其覆盖整个范围[0, K] 。如果无法覆盖范围[0, K] ,则打印-1

例子 :

朴素方法:解决问题的最简单方法是生成所有可能的子集并检查每个子集是否覆盖整个范围。

时间复杂度: O(2 N × N)
辅助空间: O(1)

高效的方法:上述方法可以通过在左元素的基础上按升序对数组进行排序来优化,对于具有相等左元素的对,按其右元素的降序对元素进行排序。现在,以最佳方式选择对。

请按照以下步骤解决问题:

  • 按左元素的升序对数组 arr[]的向量进行排序,如果左元素相等,则按对的右元素的降序对数组进行排序。
  • 检查arr[0][0] != 0然后打印-1
  • 初始化一个变量,比如Rarr[0][1] ,它存储范围的右边界, ans1 ,它存储覆盖范围[0, K]所需的范围数。
  • 使用变量i在范围[0, N-1] 中迭代并执行以下步骤:
    • 如果R == K ,则终止循环。
    • 初始化一个变量,比如maxr作为R ,它存储左边界≤ R的最大右边界。
    • 使用变量j在范围[i+1, N-1] 中迭代并执行以下步骤:
      • 如果arr[j][0] ≤ R ,则将 maxr的值修改为max(maxr, arr[j][1])
    • 将 i的值修改为j-1 ,将R的值修改为maxr,并将 ans的值增加 1。
  • 如果R不等于K ,则打印-1
  • 否则,打印ans的值。

下面是上述方法的实现:

C++14
// C++ program for the above approach
#include 
using namespace std;
 
// Function to sort the elements in
// increasing order of left element and
// sort pairs with equal left element in
// decreasing order of right element
static bool cmp(pair a, pair b)
{
    if (a.first == b.first) {
        return a.second > b.second;
    }
    else {
        return b.first > a.first;
    }
}
 
// Function to select minimum number of pairs
// such that it covers the entire range [0, K]
int MinimumPairs(vector > arr, int K)
{
    int N = arr.size();
 
    // Sort the array using comparator
    sort(arr.begin(), arr.end(), cmp);
 
    // If the start element
    // is not equal to 0
    if (arr[0].first != 0) {
        return -1;
    }
 
    // Stores the minimum
    // number of pairs required
    int ans = 1;
 
    // Stores the right bound of the range
    int R = arr[0].second;
 
    // Iterate in the range[0, N-1]
    for (int i = 0; i < N; i++) {
        if (R == K) {
            break;
        }
 
        // Stores the maximum right bound
        // where left bound ≤ R
        int maxr = R;
 
        int j;
 
        // Iterate in the range [i+1, N-1]
        for (j = i + 1; j < N; j++) {
 
            // If the starting point of j-th
            // element is less than equal to R
            if (arr[j].first <= R) {
 
                maxr = max(maxr, arr[j].second);
            }
 
            // Otherwise
            else {
                break;
            }
        }
 
        i = j - 1;
        R = maxr;
        ans++;
    }
 
    // If the right bound
    // is not equal to K
    if (R != K) {
        return -1;
    }
 
    // Otherwise
    else {
        return ans;
    }
}
 
// Driver Code
int main()
{
    // Given Input
    int K = 4;
    vector > arr{ { 0, 6 } };
 
    // Function Call
    cout << MinimumPairs(arr, K);
}


Python3
# Python3 program for the above approach
 
# Function to select minimum number of pairs
# such that it covers the entire range [0, K]
def MinimumPairs(arr, K):
     
    N = len(arr)
 
    # Sort the array using comparator
    arr.sort()
 
    # If the start element
    # is not equal to 0
    if (arr[0][0] != 0):
        return -1
 
    # Stores the minimum
    # number of pairs required
    ans = 1
 
    # Stores the right bound of the range
    R = arr[0][1]
 
    # Iterate in the range[0, N-1]
    for i in range(N):
        if (R == K):
            break
 
        # Stores the maximum right bound
        # where left bound ≤ R
        maxr = R
 
        j = 0
 
        # Iterate in the range [i+1, N-1]
        for j in range(i + 1, N, 1):
             
            # If the starting point of j-th
            # element is less than equal to R
            if (arr[j][0] <= R):
                maxr = max(maxr, arr[j][1])
 
            # Otherwise
            else:
                break
 
        i = j - 1
        R = maxr
        ans += 1
 
    # If the right bound
    # is not equal to K
    if (R != K):
        return -1
 
    # Otherwise
    else:
        return ans
 
# Driver Code
if __name__ == '__main__':
     
    # Given Input
    K = 4
    arr = [ [ 0, 6 ] ]
 
    # Function Call
    print(MinimumPairs(arr, K))
 
# This code is contributed by bgangwar59


输出
-1

时间复杂度: O(NlogN)
辅助空间: O(1)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。