Número mínimo de pares requeridos para ser seleccionados para cubrir un rango dado

Dada una array arr[] que consta de N pares y un entero positivo K , la tarea es seleccionar el número mínimo de pares que cubra todo el rango [0, K] . Si no es posible cubrir el rango [0, K] , imprima -1 .

Ejemplos:

Entrada: arr[] = {{0, 3}, {2, 5}, {5, 6}, {6, 8}, {6, 10}}, K = 10
Salida: 4
Explicación: Uno de los valores óptimos formas es seleccionar los rangos {{0, 3}, {2, 5}, {5, 6}, {6, 10}} que cubre todo el rango [0, 10].

Entrada: arr[] = {{0, 4}, {1, 5}, {5, 6}, {8, 10}}, N = 10
Salida: -1

Enfoque ingenuo: el enfoque más simple para resolver el problema es generar todos los subconjuntos posibles y verificar para cada subconjunto si cubre el rango completo o no. 

Complejidad temporal: O(2 N × N) 
Espacio auxiliar: O(1)

Enfoque eficiente: el enfoque anterior se puede optimizar ordenando la array en orden creciente sobre la base del elemento izquierdo y para pares con elementos izquierdos iguales, ordenando los elementos en orden decreciente de su elemento derecho. Ahora, elige los pares de manera óptima. 

Siga los pasos a continuación para resolver el problema:

  • Ordene el vector de pares arr[] en orden creciente del elemento izquierdo y si los elementos izquierdos son iguales, luego ordene la array en orden decreciente del elemento derecho del par.
  • Compruebe si arr[0][0] != 0 luego imprima -1 .
  • Inicialice una variable, digamos R como arr[0][1] que almacena el límite derecho del rango y ans como 1 que almacena el número de rangos necesarios para cubrir el rango [0, K] .
  • Iterar en el rango [0, N-1] usando la variable i y realizar los siguientes pasos:
    • Si R == K , termina el bucle.
    • Inicialice una variable, digamos maxr como R , que almacena el límite derecho máximo donde el límite izquierdo ≤ R .
    • Iterar en el rango [i+1, N-1] usando la variable j y realizar los siguientes pasos:
      • Si arr[j][0] ≤ R , modifique el valor de maxr como max(maxr, arr[j][1]) .
    • Modifique el valor de i como j-1 y el valor de R como maxr e incremente el valor de ans en 1.
  • Si R no es igual a K , imprima -1 .
  • De lo contrario, imprima el valor de ans .

A continuación se muestra la implementación del enfoque anterior:

C++14

// C++ program for the above approach
#include <bits/stdc++.h>
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<int, int> a, pair<int, int> 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<pair<int, int> > 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<pair<int, int> > arr{ { 0, 6 } };
 
    // Function Call
    cout << MinimumPairs(arr, K);
}

Java

// Java Program for above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
// 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 sort the elements in
// increasing order of left element and
// sort pairs with equal left element in
// decreasing order of right element
class cmp implements Comparator<Pair>
{
 
    public int compare(Pair p1, Pair p2)
    {
        if (p1.x == p2.x)
        {
            return p1.y - p2.y;
        }
        else
        {
            return p2.x - p1.x;
        }
    }
}
 
class GFG
{
    // Function to select minimum number of pairs
    // such that it covers the entire range [0, K]
    public static int MinimumPairs(Pair arr[], int K)
    {
        int N = arr.length;
        // Sort the array using comparator
        Arrays.sort(arr, new cmp());
 
        // If the start element
        // is not equal to 0
        if (arr[0].x != 0)
        {
            return -1;
        }
 
        // Stores the minimum
        // number of pairs required
        int ans = 1;
 
        // Stores the right bound of the range
        int R = arr[0].y;
 
        // 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 is less than equal to 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].x <= R)
                {
 
                    maxr = Math.max(maxr, arr[j].y);
                }
 
                // 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
    public static void main(String[] args)
    {
        int K = 4;
        int n = 1; // length of array
        Pair arr[] = new Pair[n];
        arr[0] = new Pair(0, 6);
 
        System.out.println(MinimumPairs(arr, K));
    }
}
 
// This code is contributed by rj13to.

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

Javascript

<script>
 
// JavaScript program for the above approach
 
// Function to select minimum number of pairs
// such that it covers the entire range [0, K]
function MinimumPairs(arr, K){
     
    let N = arr.length
 
    // Sort the array using comparator
    arr.sort((a,b)=>a-b)
 
    // If the start element
    // is not equal to 0
    if (arr[0][0] != 0)
        return -1
 
    // Stores the minimum
    // number of pairs required
    let ans = 1
 
    // Stores the right bound of the range
    let R = arr[0][1]
 
    // Iterate in the range[0, N-1]
    for(let i=0;i<N;i++){
        if(R == K)
            break
 
    //     // Stores the maximum right bound
    //     // where left bound ≤ R
        let maxr = R
 
        let j = 0
 
        // 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][0] <= R)
                maxr = Math.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
     
// Given Input
let K = 4
let arr = [ [ 0, 6 ] ]
 
// Function Call
document.write(MinimumPairs(arr, K),"</br>")
 
// This code is contributed by shinjanpatra
 
 
</script>
Producción

-1

Complejidad temporal: O(NlogN)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por parthagarwal1962000 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *