[Solución del problema del algoritmo] leetcode 253 Sala de conferencias II (Codicioso + Montón)

leetcode 253 Sala de conferencias II

Descripción de la pregunta

Hay n reuniones y la hora de inicio y finalización de la i-ésima reunión son si s_isyoy ei e_imiyo. Diseñe un algoritmo codicioso para encontrar el número mínimo de salas de reuniones necesarias para organizar todas las reuniones.

Dada una variedad de horarios de reuniones, cada hora de reunión incluirá la hora de inicio y finalización [[s1,e1],[s2,e2],…] (si < ei), para evitar conflictos en la reunión, se debe considerar lo suficiente. dado a Utilizando los recursos de la sala de conferencias, calcule el número mínimo de salas de conferencias necesarias para cumplir con los arreglos de estas reuniones.

Entrada : [ [0, 20], [15, 20], [20, 23], [25, 30], [15, 25] ] Salida
: 3

  • Etiqueta de algoritmo
    • avaro
    • montón

intento equivocado

  • Hay una pregunta similar a esta pregunta , que es organizar la mayor cantidad de reuniones sin conflictos. La idea de esa pregunta es ordenar la hora de finalización de la mañana a la noche. Luego, cuando vi esta pregunta, arreglé mi mente. Hice clic y pronto me equivoqué.
  • Dar un contraejemplo
    • imagen-20230103123339022
    • En este caso, el número mínimo es 2, 1 y 2 comparten una sala de conferencias y 3 y 4 comparten una.
    • Si el tiempo de finalización es desde temprano hasta tarde, entonces los primeros 4 intentarán fusionarse con 1 y se encontrará un conflicto, por lo que 4 y 2 se fusionarán y el resto no se fusionará. Hay 3 en total, lo cual no es la solución óptima.

Solución codiciosa

  • Utilice un vector para registrar la hora de finalización de la lista de horas de finalización de la sala de conferencias existente endTimeListy lista de tiempo _ _ _ _ _ _
  • Ordenar todas las reuniones por hora de inicio desde la mañana hasta la noche
  • Recorrer todas las reuniones ai a_iayo, establecido en la sala de conferencias actual end Time List endTimeListe n d T im e L i s tEncuentre la reunión final más tempranaaearlist a_{earlist}ae a r l i s t,判断aearlist a_{earlist}ae a r l i s t¿La hora de finalización de ai a_i es anterior a la de ai a_i ?ayoLa hora de inicio dee n d T im e List Actualiza la hora de finalización de la sala de conferencias. De lo contrario, abre una nueva sala de conferencias en end Time List endTimeListfinalice la lista de tiempos grabada . _ _ _ _
  • La complejidad del tiempo es O ( n 2 ) O(n^2)O ( n.2 )
#include <bits/stdc++.h>

//#define debug
#define PII pair<int,int>
#define  x first
#define  y second
using namespace std;

const int N = 100;
PII a[N];
vector<int> end_time_list;//现有会议室的结束时间集合


int main() {
#ifdef debug
    freopen("in.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0);
    int n = 0;
    while (true) {
        int t1, t2;
        cin >> t1 >> t2;
        if (!t1 && !t2)break;
        a[n++] = {t1, t2};
    }
    sort(a, a + n, [&](PII p1, PII p2) { return p1.x < p2.x; });
    for (int i = 0; i < n; ++i) {
        int idx = 0;//最早结束会议室的下标
        for (int j = 0; j < end_time_list.size(); ++j) {
            //找最早结束的会议
            if (end_time_list[j] < end_time_list[idx]) idx = j;
        }
        if (end_time_list.size() && end_time_list[idx] <= a[i].x)//当前会议的开始时间在最早结束的后面,可以复用会议室
            end_time_list[idx] = a[i].y;
        else //不能复用,新增一个会议室
            end_time_list.push_back(a[i].y);
    }
    cout << end_time_list.size() << endl;
    return 0;
}

Solución de optimización del montón

  • La operación de encontrar el valor mínimo de un conjunto y actualizarlo se puede realizar usando el montón en O ( log ⁡ n ) O(\log n)O ( log _Completado dentro de n ) complejidad temporal
  • Implementación de un montón superior pequeño usando una cola de prioridad en C++
#include <bits/stdc++.h>

//#define debug
#define PII pair<int,int>
#define  x first
#define  y second
using namespace std;

const int N = 100;
PII a[N];
priority_queue<int, vector<int>, greater<int>> heap;//最早的结束时间


int main() {
#ifdef debug
    freopen("in.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0);
    int n = 0;
    while (true) {
        int t1, t2;
        cin >> t1 >> t2;
        if (!t1 && !t2)break;
        a[n++] = {t1, t2};
    }
    sort(a, a + n, [&](PII p1, PII p2) { return p1.x < p2.x; });
    for (int i = 0; i < n; ++i) {
        if (!heap.empty() && heap.top() <= a[i].x) {
            //复用会议室
            heap.pop();
        }
        heap.push(a[i].y);
    }
    cout << heap.size() << endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/u011459717/article/details/128531372
Recomendado
Clasificación