Encuentre la plataforma a la que llega el tren dado

Dada una array 2D arr[][3] que consta de información de N trenes, donde arr[i][0] es el número de tren, arr[i][1] es la hora de llegada y arr[i][2] es la duración del tiempo de parada. Dado otro entero F que representa el número de tren, la tarea es encontrar el número de plataforma en el que llega el tren con el número de tren F de acuerdo con las siguientes reglas:

  • La numeración de plataformas comienza desde 1 y hay un número infinito de plataformas.
  • La plataforma que se libera antes se asigna al siguiente tren.
  • Si se liberan dos o más andenes al mismo tiempo, el tren llega al andén con el número de andén más bajo.
  • Si dos o más trenes llegan al mismo tiempo, entonces el tren con un número de tren más pequeño se asigna primero.

Ejemplos:

Entrada: arr[] = {{112567, 1, 2}, {112563, 3, 3}, {112569, 4, 7}, {112560, 9, 3}}, F = 112569
Salida: 1
Explicación:
A continuación se muestra el orden de llegada de los trenes: Hora de salida de
la plataforma del tren
112567 1 4
112563 2 7
112569       1 12
112560 2 13

Por tanto, el tren con el número de tren 112569 llega al andén número 1.

Entrada: arr[] = {{112567, 2, 1}, {112563, 5, 5}, {112569, 7, 3}, {112560, 3, 7}}, F = 112569
Salida: 3

Enfoque: el problema dado se puede resolver utilizando la cola de prioridad . Siga los pasos a continuación para resolver este problema:

  • Ordene la array dada arr[] de N trenes según la hora de llegada de los trenes.
  • Inicialice una cola de prioridad , digamos PQ de pares {PlatformNumber, time} que implementa el montón mínimo de acuerdo con el tiempo de salida mínimo. Inserte el {número de plataforma, hora} , es decir, {1, 0} en la cola de prioridad.
  • Inicialice un HashMap , digamos M que almacena el número de plataforma en el que llega cualquier tren.
  • Recorra la array dada arr[] y realice los siguientes pasos:
    • Abre la plataforma superior del PQ y guárdalos en free_platform[] .
    • Si la hora de llegada del tren actual es al menos la hora de salida del andén abierto, actualice la hora de salida del andén abierto como (suma de la hora de llegada y parada + 1) e inserte el estado actual del andén en PQ y el número de plataforma actual del tren actual en el HashMap M.
    • De lo contrario, agregue la nueva entrada de plataforma al PQ y el número de plataforma actual del tren actual en el HashMap M.
  • Después de completar los pasos anteriores, imprima el número de plataforma asociado con el número de tren F en el HashMap M.

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

Java

// Java program for the above approach
 
import java.util.*;
 
// Stores the information for each
// train as Objects
class Train {
    // Stores the train number
    String train_num;
 
    // Stores the arrival time
    int arrival_time;
 
    // Stores the stoppage time
    int stoppage_time;
 
    // Constructor
    Train(String train_num,
        int arrival_time,
        int stoppage_time)
    {
        this.train_num = train_num;
        this.arrival_time = arrival_time;
        this.stoppage_time = stoppage_time;
    }
}
 
public class GFG {
    // Function to find the platform
    // on which train F arrives
    static int findPlatformOf(
        ArrayList<Train> trains, int n,
        String F)
    {
        // Sort the array arr[] according
        // to the arrival time
        Collections.sort(
            trains,
            (a, b) -> a.arrival_time==b.arrival_time ? Integer.parseInt(a.train_num)-Integer.parseInt(b.train_num) : a.arrival_time - b.arrival_time);
 
        // Stores the platforms that
        // is in currently in use
        PriorityQueue<int[]> pq
            = new PriorityQueue<>(
                (a, b)
                    -> a[1] == b[1] ? a[0] - b[0]
                                    : a[1] - b[1]);
 
        // Insert the platform number 1
        // with departure time as 0
        pq.add(new int[] { 1, 0 });
 
        // Store the platform number
        // on which train arrived
        HashMap<String, Integer> schedule
            = new HashMap<>();
 
        // Traverse the given array
        for (Train t : trains) {
 
            // Pop the top platform of
            // the priority queue
            int[] free_platform = pq.poll();
 
            // If arrival time of the train
            // >= freeing time of the platform
            if (t.arrival_time >= free_platform[1]) {
                // Update the train status
                free_platform[1]
                    = t.arrival_time + t.stoppage_time + 1;
 
                // Add the current platform
                // to the pq
                pq.add(free_platform);
 
                // Add the platform
                // number to the HashMap
                schedule.put(t.train_num,
                            free_platform[0]);
            }
 
            // Otherwise, add a new platform
            // for the current train
            else {
 
                // Update the priority queue
                pq.add(free_platform);
 
                // Get the platform number
                int platform_num = pq.size() + 1;
 
                // Add the platform to
                // the priority queue
                pq.add(new int[] {
                    platform_num,
                    t.arrival_time
                        + t.stoppage_time + 1 });
 
                // Add the platform
                // number to the HashMap
                schedule.put(t.train_num,
                            platform_num);
            }
        }
 
        // Return the platform on
        // which F train arrived
        return schedule.get(F);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        ArrayList<Train> trains
            = new ArrayList<>();
 
        trains.add(new Train(
 
            "112567", 2, 1));
        trains.add(new Train(
            "112569", 5, 5));
        trains.add(new Train(
            "112563", 5, 3));
        trains.add(new Train(
            "112560", 3, 7));
        String F = "112563";
 
        System.out.println(
            findPlatformOf(
                trains, trains.size(), F));
    }
}
Producción: 

3

 

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

Publicación traducida automáticamente

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