POJ 3190 Reservas Puesto de cola de prioridad

Oh aquellos exigente N (1 <= n <= 50.000) vacas! Son tan exigente que cada uno sólo se ordeñan más de un tiempo preciso intervalo A ... B (1 <= A <= B <= 1.000.000), que incluye las dos veces A y B. Obviamente, FJ debe crear un sistema de reserva para determinar Stall, que cada vaca se le puede asignar por su tiempo de ordeño. Por supuesto, ninguna vaca compartirá un momento tan privado con otras vacas.

Ayuda FJ determinando:
El número mínimo de puestos requeridos en el granero para que cada vaca puede tener su período de ordeño privada
Una asignación de vacas a estos puestos con el tiempo
Muchas respuestas son correctas para cada conjunto de datos de prueba; un grado de voluntad programa de su respuesta.
Entrada
Línea 1: un solo número entero, N

Las líneas 2 ... N + 1: Línea i + 1 describe vaca intervalo de ordeño i de con dos enteros separados por espacios.
Salida de
Línea 1: El número mínimo de puestos de la granja debe tener.

Las líneas 2 ... N + 1: Línea i + 1 describe el puesto para el cual la vaca i serán asignados por su período de ordeño.
SampleInput
5
1 10
2 4
3 6
5 8
4 7
SampleOutput
4
1
2
3
2
4

Significado de las preguntas: el periodo n de leche de vaca (s, t) dado dos vacas no pueden compartir un bullpen, al menos preguntar cuántos bullpen puede organizar
las ideas: la primera hora de empezar a pequeñas a grandes avaricia, después de que el mantenimiento de cola de prioridad una hora anterior período de tiempo final de cada vaca, si al final de un cierto período de tiempo hay una cola de prioridad es menor que el tiempo de inicio de la serie, las dos vacas pertenecen a un establo común, o la necesidad de abrir otra bullpen.

#include <iostream>
#include <queue>
#include <algorithm>

using namespace std;
const int N = 50005;

int ans[N];

struct node
{
    int s,t;
    int id;///记录位置

    friend bool operator < (const node &a,const node &b)
    {
        if(a.t==b.t)
            return a.s < b.s;///优先队列中以结束时间升序排列,最小留在堆顶
        return a.t > b.t;
    }

} a[N];

bool cmp(node a,node b)///数组中以开始时间升序排序
{
    if(a.s!=b.s)
        return a.s < b.s;
    return a.t < b.t;
}

int main()
{
    int n;
    ios::sync_with_stdio(false);

    while(cin >> n)
    {
        for(int i=1; i<=n; i++)
        {
            cin >> a[i].s >> a[i].t;
            a[i].id=i;
        }

        sort(a+1,a+1+n,cmp);

        int res=1;

        priority_queue<node>que;

        que.push(a[1]);///先压入第一个数
        ans[a[1].id]=1;

        for(int i=2; i<=n; i++)
        {
            if(!que.empty()&&que.top().t<a[i].s)///如果堆顶的结束时间小于当前这头牛的开始时间则在不同时间可以共用一个牛棚
            {
                ans[a[i].id]=ans[que.top().id];///记录答案
                que.pop();
            }
            else
            {
                res++;///不满足的话就需要另一个牛棚 答案加一
                ans[a[i].id]=res;
            }
            que.push(a[i]);
        }

        cout << res << endl;

        for(int i=1; i<=n; i++)
            cout << ans[i] << endl;
    }

    return 0;
}

Resumen: En ese momento yo no lo escribí no es una cola de prioridad debe saber cómo utilizar, cómo registrar las respuestas, de hecho, siempre y cuando el uso del principio del subíndice de matriz, se puede ir como un registro subíndice las respuestas

Publicado 54 artículos originales · ganado elogios 0 · Vistas 1233

Supongo que te gusta

Origin blog.csdn.net/weixin_44144278/article/details/98904054
Recomendado
Clasificación