Reservas Stall (un algoritmo voraz) - Estudio Notas

Descripción del problema

N-ganado (1 <= n <= 50000 ) para ser ordeñadas. Dada tiempo cada zona de ordeño de la vaca
entre [A, B] (1 < = A <= B <= 1.000.000, A, B es un número entero).
El ganado necesita para mantenerse ordeño corral. Un corral al mismo tiempo que sólo puede albergar una vaca.
P. ¿Cuántos corrales al menos, para completar todo el ordeño, y cada cabeza de ganado que han puesto el corral (juzgado especial)
a un corral con dos vacas, que son ordeñadas intervalo de tiempo incluso si el punto final no es sólo una coincidencia posible.

algoritmo voraz

Aquí, todas las vacas de ordeño necesitan, ordeñar una vaca cuándo, es necesario buscar las vacas.

S (x) representa un tiempo de inicio x de vacas. E (x) indica el final del tiempo x. De E (x), x puede ser vacas, también puede ser un corral. Hora de finalización corral al final de los tiempos, es que hay vacas en ordeño. Al mismo tiempo el extremo del corral varía constantemente.

Esquema de Solución
1: El ordeño de vacas ordenadas desde la parte delantera a la hora de inicio de vuelta
2: asignación de una primera vaca puestos
3: procesar secuencialmente cada una detrás de la vaca, vacas tratamiento, considere la parada asignada ha terminado la primera vez corral x.
Cuando al final de un tiempo de bloqueo <hora de inicio de las vacas, no la asignación de nuevos puestos, puedo entrar en x, y modificar la hora de finalización puesto de E (i)
Si el extremo puesto de tiempo> = vacas hora de inicio, la asignación de un nuevo animal bar, E (i)
extremos hasta que todas las vacas de procesamiento

puntos

Necesidad de utilizar la cola de prioridad para almacenar corral ya asignada, por lo que los tiempos finales y siempre a la cabeza corral primera de la cola.

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
struct Cow {//奶牛
    int a, b; //挤奶区间起终点
    int No; //编号
    bool operator<(const Cow& c) const {
        return a < c.a;//按照开始时间从早到晚排序
    }
} cows[50100];
int pos[50100]; //pos[i]表示编号为i的奶牛去的畜栏编号
struct Stall {//畜栏
    int end; //结束时间
    int No; //编号
    bool operator<(const Stall& s) const {
        return end > s.end;//按照畜栏的结束时间排序
    }
    Stall(int e, int n) :end(e), No(n) { }
};
int main()
{
    int n;
    cin>>n;
    for (int i = 0; i < n; ++i) {
        cin>>cows[i].a>>cows[i].b;
        cows[i].No = i;
    }
    sort(cows, cows + n);
    int total = 0;
    priority_queue<Stall> pq;//畜栏的队列
    for (int i = 0; i < n; ++i) {
        if (pq.empty()) {//如果畜栏为空的话,就是放入第一个畜栏
            ++total;
            pq.push(Stall(cows[i].b, total));//并且新开一个畜栏,以放入当前奶牛的结束时间为畜栏的结束时间
            pos[cows[i].No] = total;
        }
        else {
            Stall st = pq.top();//指向队列的顶端,即即将释放的畜栏
            if (st.end < cows[i].a) { //端点也不能重合////如果畜栏的结束时间早于奶牛的开始时间的话
                pq.pop();
                pos[cows[i].No] = st.No;
                pq.push(Stall(cows[i].b, st.No));
            }
            else { //对应 if( st.end < cows[i].a //畜栏的结束时间晚于奶牛的开始时间,即队列中没有可以释放的畜栏,就新开一个畜栏放入奶牛
                ++total;
                pq.push(Stall{cows[i].b,total });//畜栏结束时间设置为奶牛结束
                pos[cows[i].No] = total;
            }
        }
    }
    cout << total << endl;
    for (int i = 0; i < n; ++i)
        cout << pos[i] << endl;
    return 0;
}
Publicado 97 artículos originales · ganado elogios 208 · Vistas a 70000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_45822638/article/details/105272109
Recomendado
Clasificación