Averigüe si k reservas son posibles con los horarios de llegada y salida dados

El gerente de un hotel tiene que procesar N reservas anticipadas de habitaciones para la próxima temporada. Su hotel tiene habitaciones K. Las reservas contienen una fecha de llegada y una fecha de salida. Quiere saber si hay suficientes habitaciones en el hotel para satisfacer la demanda. 

La idea es ordenar las arrays y realizar un seguimiento de las superposiciones.

Ejemplos:  

Input :  Arrivals :   [1 3 5]
         Departures : [2 6 8]
         K: 1
Output: False
Hotel manager needs at least two
rooms as the second and third 
intervals overlap.

Enfoque 1 
La idea es almacenar las horas de llegada y salida en una array auxiliar con un marcador adicional para indicar si la hora es de llegada o de salida. Ahora ordena la array. Procese la array ordenada, para cada incremento de llegada de reservas activas. Y por cada salida, decremento. Realice un seguimiento de las reservas activas máximas. Si el recuento de reservas activas en cualquier momento es superior a k, devuelve falso. De lo contrario, devuelve verdadero.

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

C++

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
 
bool areBookingsPossible(int arrival[],
                         int departure[], int n, int k)
{
    vector<pair<int, int> > ans;
 
    // create a common vector both arrivals
    // and departures.
    for (int i = 0; i < n; i++) {
        ans.push_back(make_pair(arrival[i], 1));
        ans.push_back(make_pair(departure[i], 0));
    }
 
    // sort the vector
    sort(ans.begin(), ans.end());
 
    int curr_active = 0, max_active = 0;
 
    for (int i = 0; i < ans.size(); i++) {
 
        // if new arrival, increment current
        // guests count and update max active
        // guests so far
        if (ans[i].second == 1) {
            curr_active++;
            max_active = max(max_active,
                             curr_active);
        }
 
        // if a guest departs, decrement
        // current guests count.
        else
            curr_active--;
    }
 
    // if max active guests at any instant
    // were more than the available rooms,
    // return false. Else return true.
    return (k >= max_active);
}
 
int main()
{
    int arrival[] = { 1, 3, 5 };
    int departure[] = { 2, 6, 8 };
    int n = sizeof(arrival) / sizeof(arrival[0]);
    cout << (areBookingsPossible(arrival,
                                 departure, n, 1)
                 ? "Yes\n"
                 : "No\n");
    return 0;
}

Java

// Java implementation of the above approach
import java.io.*;
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 define user defined conparator
class Compare {
 
  static void compare(Pair arr[], int n)
  {
 
    // Comparator to sort the pair according to second element
    Arrays.sort(arr, new Comparator<Pair>() {
      @Override public int compare(Pair p1, Pair p2)
      {
        return p1.x - p2.x;
      }
    });
  }
}
 
class GFG
{
  static boolean areBookingsPossible(int arrival[],
                                     int departure[],
                                     int n, int k)
  {
    Pair ans[] = new Pair[2*n];
 
    // create a common vector both arrivals
    // and departures.
    int j = 0;
    for (int i = 0; i < n; i++)
    {
      ans[i + j] = new Pair(arrival[i], 1);
      ans[i + j + 1] = new Pair(departure[i], 0);
      j++;
    }
 
    // sort the vector
    Compare obj = new Compare();
    obj.compare(ans, 2 * n);     
    int curr_active = 0, max_active = 0;    
    for (int i = 0; i < 2 * n; i++)
    {
 
      // if new arrival, increment current
      // guests count and update max active
      // guests so far
      if (ans[i].y == 1)
      {
        curr_active++;
        max_active = Math.max(max_active,
                              curr_active);
      }
 
      // if a guest departs, decrement
      // current guests count.
      else
        curr_active--;
    }
 
    // if max active guests at any instant
    // were more than the available rooms,
    // return false. Else return true.
    return (k >= max_active);
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int arrival[] = { 1, 3, 5 };
    int departure[] = { 2, 6, 8 };
    int n = arrival.length;
    System.out.println(areBookingsPossible(arrival, departure, n, 1) ? "Yes" : "No");
  }
}
 
// This code is contributed by divyeshrabadiya07

Python3

# Python3 code for the above approach.
def areBookingsPossible(arrival, departure, n, k):
 
    ans = []
 
    # Create a common vector both arrivals
    # and departures.
    for i in range(0, n):
        ans.append((arrival[i], 1))
        ans.append((departure[i], 0))
 
    # Sort the vector
    ans.sort()
    curr_active, max_active = 0, 0
 
    for i in range(0, len(ans)):
 
        # If new arrival, increment current
        # guests count and update max active
        # guests so far
        if ans[i][1] == 1:
            curr_active += 1
            max_active = max(max_active,
                             curr_active)
 
        # if a guest departs, decrement
        # current guests count.
        else:
            curr_active -= 1
 
    # If max active guests at any instant
    # were more than the available rooms,
    # return false. Else return true.
    return k >= max_active
 
# Driver Code
if __name__ == "__main__":
 
    arrival = [1, 3, 5]
    departure = [2, 6, 8]
    n = len(arrival)
     
    if areBookingsPossible(arrival,
                           departure, n, 1):
        print("Yes")
    else:
        print("No")
     
# This code is contributed by Rituraj Jain

Javascript

<script>
 
// JavaScript implementation of the above approach
 
function areBookingsPossible(arrival, departure, n, k)
{
    var ans = [];
 
    // create a common vector both arrivals
    // and departures.
    for (var i = 0; i < n; i++) {
        ans.push([arrival[i], 1]);
        ans.push([departure[i], 0]);
    }
 
    // sort the vector
    ans.sort();
 
    var curr_active = 0, max_active = 0;
 
    for (var i = 0; i < ans.length; i++) {
 
        // if new arrival, increment current
        // guests count and update max active
        // guests so far
        if (ans[i][1] == 1) {
            curr_active++;
            max_active = Math.max(max_active,
                             curr_active);
        }
 
        // if a guest departs, decrement
        // current guests count.
        else
            curr_active--;
    }
 
    // if max active guests at any instant
    // were more than the available rooms,
    // return false. Else return true.
    return (k >= max_active);
}
 
var arrival = [1, 3, 5];
var departure = [2, 6, 8];
var n = arrival.length;
document.write(areBookingsPossible(arrival,
                             departure, n, 1)
             ? "Yes"
             : "No");
 
</script>
Producción

No

Complejidad de Tiempo: O(n Log n) 
Espacio Auxiliar: O(n)

Enfoque 2 
La idea es simplemente ordenar las 2 arrays (Array para fechas de llegada y Array para fechas de salida) primero. 
Ahora, el siguiente paso sería verificar cuántas superposiciones hay en un rango en particular. Si el número de superposiciones es mayor que el número de habitaciones, podemos decir que tenemos menos habitaciones para alojar huéspedes. 

Por lo tanto, para un rango particular donde la fecha de llegada (la iésima de la array de llegada) es la fecha de inicio y la fecha de salida (la iésima de la array de salida) es la fecha de finalización, la superposición solo puede ser posible si las próximas fechas de llegada (desde i+1) son menor que la fecha de finalización del rango y mayor o igual que la fecha de inicio del rango (Dado que se trata de una array ordenada, no es necesario que nos preocupemos por la última condición). 

Teniendo en cuenta el hecho de que hemos ordenado la array, debemos verificar directamente si la próxima fecha de llegada Kth (i + Kth) cae en el rango, si es así, todas las fechas anteriores a esa fecha de llegada también caerán en el rango tomado, resultando en superposiciones de K+1 con el rango en cuestión, por lo tanto, excediendo el número de habitaciones. 

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

C++

// C++ code implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
 
string areBookingsPossible(int A[], int B[],
                           int K, int N)
{
    sort(A, A + N);
    sort(B, B + N);
     
    for(int i = 0; i < N; i++)
    {
        if (i + K < N && A[i + K] < B[i])
        {
            return "No";
        }
    }
    return "Yes";
}
 
// Driver Code
int main()
{
    int arrival[] = { 1, 2, 3 };
    int departure[] = { 2, 3, 4 };
    int N = sizeof(arrival) / sizeof(arrival[0]);
    int K = 1;
   
    cout << (areBookingsPossible(
        arrival, departure, K, N));
 
    return 0;
}
 
// This code is contributed by rag2127

Java

// Java code implementation of the above approach
import java.util.*;
class GFG
{
      
static String areBookingsPossible(int []A, int []B,
                                  int K)
{
    Arrays.sort(A);
    Arrays.sort(B);  
    for(int i = 0; i < A.length; i++)
    {
        if (i + K < A.length && A[i + K] < B[i])
        {
            return "No";
        }
    }
    return "Yes";
}
  
// Driver Code
public static void main(String []s)
{
    int []arrival = { 1, 2, 3 };
    int []departure = { 2, 3, 4 };
    int K = 1;    
    System.out.print(areBookingsPossible(
        arrival, departure, K));
}
}
 
// This code is contributed by Pratham76

Python

# Python Code Implementation of the above approach
def areBookingsPossible(A, B, K):
        A.sort()
        B.sort()
        for i in range(len(A)):
            if i+K < len(A) and A[i+K] < B[i] :
                return "No"
        return "Yes"
 
if __name__ == "__main__":
    arrival = [1, 2, 3] 
    departure = [2, 3, 4]  
    K = 1
    print areBookingsPossible(arrival,departure,K)
 
# This code was contributed by Vidhi Modi

C#

// C# code implementation of the above approach
using System;
 
class GFG{
     
static string areBookingsPossible(int []A, int []B,
                                  int K)
{
    Array.Sort(A);
    Array.Sort(B);
     
    for(int i = 0; i < A.Length; i++)
    {
        if (i + K < A.Length && A[i + K] < B[i])
        {
            return "No";
        }
    }
    return "Yes";
}
 
// Driver Code
static void Main()
{
    int []arrival = { 1, 2, 3 };
    int []departure = { 2, 3, 4 };
    int K = 1;
     
    Console.Write(areBookingsPossible(
        arrival, departure, K));
}
}
 
// This code is contributed by rutvik_56

Javascript

<script>
     
// Javascript code implementation of
// the above approach
function areBookingsPossible(A, B, K, N)
{
    A.sort();
    B.sort();
 
    for(let i = 0; i < N; i++)
    {
        if (i + K < N && A[i + K] < B[i])
        {
            return "No";
        }
    }
    return "Yes";
}
 
// Driver code
let arrival = [ 1, 2, 3 ];
let departure = [ 2, 3, 4 ];
let N = arrival.length;
let K = 1;
     
document.write(areBookingsPossible(
    arrival, departure, K, N));
   
// This code is contributed by suresh07
   
</script>
Producción

Yes

Complejidad de tiempo: O(n Log n) 
Espacio auxiliar: O(n) utilizado por Python sort

Enfoque 3

La idea es agregar las horas de llegada y salida de cada reserva a una lista y luego agregarla a otra lista de listas. Después de eso, ordenaremos la lista según el orden creciente de los tiempos de llegada. En caso de que dos reservas tengan la misma hora de llegada, lo ordenaremos en función de las horas de salida anticipadas.

Cree una cola de prioridad (min-heap) y recorra cada reserva de la array ordenada. Para cada recorrido, presione la hora de salida en la cola de prioridad y disminuya el valor de k (número de habitaciones). Si el valor de k llega a cero, significa que no tenemos habitaciones disponibles, entonces extraeremos la hora mínima de salida de la habitación con la ayuda de nuestra cola de prioridad. 

Podemos aceptar la reserva solo y solo si esa hora mínima de salida es inferior a la hora de llegada de la reserva o si es imposible aceptar la reserva.  

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

Java

/*package whatever //do not write package name here */
 
import java.util.*;
 
class GFG {
    public static boolean areBookingsPossible(int arrival[], int departure[], int n, int k) {
        List<List<Integer>> list = new ArrayList<>();
        for(int i = 0; i < arrival.length; i++) {
            List<Integer> li = new ArrayList<>();
            li.add(arrival[i]);
            li.add(departure[i]);
            list.add(li);
        }
 
        //sorting the List
        Collections.sort(list, new Comp());
        PriorityQueue<Integer> pq = new PriorityQueue<>();
 
        for(int i = 0; i < list.size(); i++) {
            if(list.get(i).get(0) != list.get(i).get(1)) {
                if(k > 0) {
                    k--;
                    pq.add(list.get(i).get(1));
                } else {
                    if(pq.peek() <= list.get(i).get(0)) {
                        pq.remove();
                        pq.add(list.get(i).get(1));
                    } else {
                        return false;
                    }
                }
            }
        }
 
        return true;
    }
     
    // Driver code
    public static void main(String[] args)
    {
        int arrival[] = { 1, 3, 5 };
        int departure[] = { 2, 6, 8 };
        int n = arrival.length;
        System.out.println(areBookingsPossible(arrival, departure, n, 1) ? "Yes" : "No");
    }
}
 
class Comp implements Comparator<List<Integer>> {
    public int compare (List<Integer> l1, List<Integer> l2) {
        if(l1.get(0) < l2.get(0)) {
            return -1;
        } else if(l1.get(0) == l2.get(0)) {
            if(l1.get(1) < l2.get(1)) {
                return -1;
            } else {
                return 1;
            }
        } else {
            return 1;
        }
    }
}
 
//This code is contributed by darshanagrawalla06

Complejidad de tiempo : O (n Log n) 

Espacio Auxiliar : O(k) 

Publicación traducida automáticamente

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