Número mínimo de enteros necesarios para que cada Segmento contenga al menos uno de ellos

Dadas dos arrays start[] y end[] que consisten en números enteros positivos que indican los puntos inicial y final de un segmento respectivamente, la tarea es encontrar el número mínimo de números enteros que se encuentra en al menos uno de los segmentos dados y cada segmento contiene al menos menos uno de ellos.

Ejemplos: 

Entrada: start[] = {1, 2, 3}, end[] = { 3, 5, 6} 
Salida:
Explicación: 
Los tres rangos ([1, 3], [2, 5], [3, 6 ]) contiene el entero 3. 

Entrada: start[] = {4, 1, 2, 5}, end[] = {7, 3, 5, 6} 
Salida: 3 6 
Explicación: 
Los segmentos {1, 3} y {2, 5} contienen el entero 3. 
Los segmentos {4, 7} y {5, 6} contienen el entero 6. 

Formulación matemática: 
La forma matemática de describir el problema es considerar cada rango dado de números enteros como un segmento de línea definido por dos coordenadas enteras [a i , b i ] en una línea. Entonces, el número mínimo de enteros requeridos para cubrir cada uno del rango dado es el número mínimo de puntos tal que cada segmento contiene al menos un punto. 
La representación del Ejemplo 1 se muestra a continuación: 

Enfoque ingenuo: 
la forma más sencilla de resolver el problema es encontrar el valor mínimo de todos los puntos iniciales y el valor máximo de todos los puntos finales de todos los segmentos. Iterar sobre este rango, y para cada punto en este rango, realizar un seguimiento de la cantidad de segmentos que se pueden cubrir usando este punto. Use una array para almacenar el número de segmentos como:

arr[punto] = número de segmentos que se pueden cubrir usando este punto

  1. Encuentre el valor máximo en la array arr[] .
  2. Si este valor máximo es igual a N, el índice correspondiente a este valor es el punto que cubre todos los segmentos.
  3. Si este valor máximo es menor que N , entonces el índice correspondiente a este valor es un punto que cubre algunos segmentos.
  4. Repita los pasos 1 a 3 para la array arr[] excluyendo este valor máximo hasta que la suma de todos los valores máximos encontrados sea igual a N.

Complejidad temporal: O((A-B+1)*N), donde A es el máximo de los puntos finales de los segmentos y B es el mínimo de los puntos iniciales de los segmentos. 
Espacio Auxiliar: O(1)

Enfoque eficiente: 
el problema se puede resolver de manera eficiente utilizando la técnica Greedy . Siga los pasos que se indican a continuación para resolver el problema: 

  • Ordena los segmentos por sus puntos finales.
  • Seleccione el punto (o coordenada) correspondiente al punto final mínimo de todos los segmentos.
  • Ahora, todos los segmentos cuyo punto de inicio sea menor que este punto seleccionado y cuyos puntos finales sean mayores que este punto seleccionado pueden ser cubiertos por este punto.
  • Luego imprima el número mínimo de puntos.

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

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// function to sort the 2D vector
// on basis of second element.
bool sortcol(const pair<int, int> p1,
             const pair<int, int> p2)
{
    return p1.second < p2.second;
}
 
// Function to compute minimum number
// of points which cover all segments
void minPoints(pair<int, int> points[], int n)
{
     
    // Sort the list of tuples by
    // their second element.
    sort(points, points + n, sortcol);
 
    // To store the solution
    vector<int> coordinates;
    int i = 0;
 
    // Iterate over all the segments
    while (i < n)
    {
        int seg = points[i].second;
        coordinates.push_back(seg);
        int p = i + 1;
 
        if (p >= n)
            break;
 
        // Get the start point of next segment
        int arrived = points[p].first;
 
        // Loop over all those segments whose
        // start point is less than the end
        // point of current segment
        while (seg >= arrived)
        {
            p += 1;
 
            if (p >= n)
                break;
 
            arrived = points[p].first;
        }
        i = p;
    }
     
    // Print the possibles values of M
    for(auto point : coordinates)
        cout << point << " ";
}
 
// Driver code
int main()
{
    int n = 4;
 
    // Starting points of segments
    int start[] = { 4, 1, 2, 5 };
 
    // Ending points of segments
    int end[] = { 7, 3, 5, 6 };
 
    pair<int, int> points[n];
 
    // Insert ranges in points[]
    for(int i = 0; i < n; i++)
    {
        points[i] = { start[i], end[i] };
    }
 
    // Function call
    minPoints(points, n);
 
    return 0;
}
 
// This code is contributed by Kingash

Java

// Java program for the above approach
import java.util.*;
 
class GFG{
     
// Function to compute minimum number
// of points which cover all segments
static void minPoints(int[][] points, int n)
{
     
    // Sort the list of tuples by
    // their second element.
    Arrays.sort(points, (a, b) -> a[1] - b[1]);
 
    // To store the solution
    ArrayList<Integer> coordinates = new ArrayList<>();
    int i = 0;
 
    // Iterate over all the segments
    while (i < n)
    {
        int seg = points[i][1];
        coordinates.add(seg);
        int p = i + 1;
 
        if (p >= n)
            break;
 
        // Get the start point of next segment
        int arrived = points[p][0];
 
        // Loop over all those segments whose
        // start point is less than the end
        // point of current segment
        while (seg >= arrived)
        {
            p += 1;
             
            if (p >= n)
                break;
                 
            arrived = points[p][0];
        }
        i = p;
    }
 
    // Print the possibles values of M
    for(Integer point : coordinates)
        System.out.print(point + " ");
}
 
// Driver code
public static void main(String[] args)
{
 
    int n = 4;
 
    // Starting points of segments
    int[] start = { 4, 1, 2, 5 };
 
    // Ending points of segments
    int[] end = { 7, 3, 5, 6 };
 
    int[][] points = new int[n][2];
 
    // Insert ranges in points[]
    for(int i = 0; i < n; i++)
    {
        points[i][0] = start[i];
        points[i][1] = end[i];
    }
 
    // Function call
    minPoints(points, n);
}
}
 
// This code is contributed by offbeat

Python3

# Python3 program for the above approach
 
# Function to compute minimum number
# of points which cover all segments
def minPoints(points):
 
    # Sort the list of tuples by
    # their second element.
    points.sort(key = lambda x: x[1])
 
    # To store the solution
    coordinates = []
    i = 0
 
    # Iterate over all the segments
    while i < n:
 
        seg = points[i][1]
        coordinates.append(seg)
        p = i + 1
 
        if p >= n:
            break
 
        # Get the start point of next segment
        arrived = points[p][0]
 
        # Loop over all those segments whose
        # start point is less than the end
        # point of current segment
        while seg >= arrived:
 
            p += 1
            if p >= n:
                break
            arrived = points[p][0]
        i = p
 
# Print the possibles values of M
    for point in coordinates:
        print(point, end =" ")
 
 
# Driver Code
n = 4
 
# Starting points of segments
start = [4, 1, 2, 5]
 
# Ending points of segments
end = [7, 3, 5, 6]
 
points = []
 
# Insert ranges in points[]
for i in range(n):
    tu = (start[i], end[i])
    points.append(tu)
 
# Function Call
minPoints(points)

Javascript

<script>
 
// JavaScript program for the above approach
 
// Function to compute minimum number
// of points which cover all segments
function minPoints(points){
 
    // Sort the list of tuples by
    // their second element.
    points.sort((a,b)=>a[1]-b[1])
 
    // To store the solution
    let coordinates = []
    let i = 0
 
    // Iterate over all the segments
    while(i < n){
 
        let seg = points[i][1]
        coordinates.push(seg)
        let p = i + 1
 
        if(p >= n)
            break
 
        // Get the start point of next segment
        let arrived = points[p][0]
 
        // Loop over all those segments whose
        // start point is less than the end
        // point of current segment
        while(seg >= arrived){
 
            p += 1
            if(p >= n)
                break
            arrived = points[p][0]
        }
        i = p
    }
 
    // Print the possibles values of M
    for(let point of coordinates)
        document.write(point," ")
}
 
// Driver Code
let n = 4
 
// Starting points of segments
let start = [4, 1, 2, 5]
 
// Ending points of segments
let end = [7, 3, 5, 6]
 
let points = []
 
// Insert ranges in points[]
for(let i = 0; i < n; i++){
    let tu = [start[i], end[i]]
    points.push(tu)
}
 
// Function Call
minPoints(points)
 
// This code is contributed by shinjanpatra
 
</script>
Producción: 

3 6

 

Complejidad de tiempo: O(N*log N) 
Espacio auxiliar: O(N)
 

Publicación traducida automáticamente

Artículo escrito por shivampatel5 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 *