[USACO06FEB] Reservas de puesto S (Construcción)

Descripción del título:

Las vacas N (l <N <50000) de John son tan difíciles de esperar que incluso tienen su propio período de ordeño único. Por supuesto, para una vaca, su período de ordeño diario es fijo, para el período de tiempo A a B incluye el período de tiempo A y el período de tiempo B. Obviamente, John debe desarrollar un sistema de control para decidir qué establo debe organizarse cada vaca para ordeñar, porque las vacas obviamente no quieren ser vistas por otras vacas durante el ordeño.

John quiere que lo ayudes a calcular: si quieres cumplir con los requisitos de las vacas, y cada vaca debe ser ordeñada todos los días, al menos cuántos graneros se necesitan • En qué establo se debe ordeñar cada vaca. Si hay varias respuestas, solo necesita una.

Solución:

Muchas personas en Internet usan la avaricia, y doy un enfoque alternativo aquí.

Obviamente el bullpen tiene un límite superior, que es n.

Supongamos primero que hay n bullpens. Coloque las horas de inicio y finalización de las vacas en una matriz y márquelas de manera diferente, ordénelas por hora (la hora de inicio con la misma hora debe ser anterior a la hora de finalización).

En primer lugar, los n bullpens son libres al principio.

El número de bullpens libres disminuye en uno en un momento de inicio, y el número de bullpens libres aumenta en uno en un momento final.

Encontramos el valor mínimo del establo libre después de cada operación. Obviamente, estos establos nunca se han utilizado y no son necesarios. Se utilizan los establos restantes.

Sabemos que la estructura del menor número de bullpens es muy simple.

Primero ponemos todos los bullpens gratis en una cola, y cada vez que queremos usarlo, iremos a la cola, y cada vez que lo usemos, lo volveremos a poner en la cola.

#include <iostream> 
#include <cstdio> 
#include <algorithm> 
#include <queue>
 usando el  espacio de nombres std;
const  int N = 50010 ;
int n;
int a [N], b [N];
struct node {
     int t, f, id; 
} p [N << 1 ];
int top;
int lim, mi, num;
int ans [N]; 
cola < int > q;
bool cmp (nodo x, nodo y) {
     if (xt == yt) returnxf> yf;
    return xt < yt; 
} 
int main () { 
    scanf ( " % d " , & n);
    para ( int i = 1 ; i <= n; i ++ ) { 
        scanf ( " % d% d " , & a [i], & b [i]); 
        p [ ++ top] = nodo {a [i], 1 , i}; 
        p [ ++ top] = nodo {b [i], 0 , i}; 
    } 
    sort (p + 1 , p + 1 + top, cmp); 
    mi = lim =norte;
    para ( int i = 1 ; i <= top; i ++ ) {
         if (p [i] .f == 1 ) { 
            lim - ; 
        } else { 
            lim ++ ; 
        } 
        mi = min (mi, lim); 
    } 
    num = lim - mi; 
    printf ( " % d \ n " , num);
    para ( int i = 1 ; i <= num; i ++ ) q.push (i);
    para ( int i =1 ; i <= arriba; i ++ ) {
         if (p [i] .f == 1 ) { 
            ans [p [i] .id] = q.front (); 
            q.pop (); 
        } else { 
            q.push (ans [p [i] .id]); 
        } 
    } 
    para ( int i = 1 ; i <= n; i ++ ) { 
        printf ( " % d " , ans [i]); 
        putchar ( ' \ n ' ); 
    } 
    devuelve  0 ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/zcr-blog/p/12718381.html
Recomendado
Clasificación