Reserva de corral

tema

tema

práctica

Ahora consideramos un método codicioso, presionamos ll para todo el ganadoOrdeno de nuevo, y luego recorre de pequeño a grande. Si todos mis corrales están funcionando ahora, entonces crearé un nuevo corral, de lo contrario, simplemente elijo un corral (de todos modos no funciona, es lo mismo), no es difícil. Creo que está bien, pero ¿es riguroso demostrarlo? Será mejor que freír yxc y QMQ.


probar:

Por contradicción, suponga que hay un esquema que hace que el número de puestos necesarios sea menor, y el número de puestos necesarios es mmm

Considerando el enfoque anterior, el primer nuevo m + 1 m + 1metro+En el momento de 1 corral, se puede suponer que el procesamiento actual es eliiYo cabeza de ganado.

Dado que todas las vacas se clasifican de pequeñas a grandes de acuerdo con la hora de inicio, ahora mmLa hora de inicio de la última vaca en m corrales debe ser menor o igual que laiésimaLa hora de inicio de i vacas.

Y el frente mmEl tiempo de finalización más pequeño de m corrales es mayor o igual que eli-ésimoLa hora de inicio de la vaca i , por lo que el intervalo de pastoreo de la última vaca en el primer corral mm debe incluir laiila hora de inicio de i vacas, por lo que encontramosm + 1 m + 1metro+1 intervalo tiene una intersección, por lo quese requiereal menosm + 1 m + 1metro+1 corral, contradictorio.

Por lo tanto, la solución óptima se puede obtener mediante el método anterior y se completa la prueba.


Por supuesto, en cuanto al número de procesamiento y para ver si este corral está libre, utilizo la pila de raíces pequeña para procesar, y la pila de raíces pequeña se clasifica según el tiempo de liberación (es decir, el tiempo de finalización de la vaca + 1).

Aquí lo probé nuevamente, de hecho, el número máximo de cobertura también puede averiguar cuántos corrales se necesitan, como [1, 5] [1,5][ 1 ,5 ] y[2, 6] [2,6][ 2 ,6 ][2, 5] [2,5][ 2 ,5 ] cubre el número de2 22 , entonces la respuesta es2 22. De hecho, no es difícil pensar que si dos intervalos tienen una intersección, significa que no pueden estar en el mismo corral, por lo que si como máximonnSi n no se puede establecer,nnn corrales. (No sé cómo demostrarlo. Si lo sabes, puedes responderme. Lo escribiré en el blog, aunque personalmente creo que es correcto).

Personalmente, aquí hay una prueba falsa, para mmPara m puestos, consideramos cada vaca en el segundo puesto. Si no hay conflicto entre el rango de esta vaca y el primer puesto, muévala al primer puesto, de modo que el segundo puesto Las vacas en la primera columna tienen conflictos en la primera columna, y en la tercera columna, la primera y la segunda columnas están al mismo tiempo (primero pasa a la columna numerada inferior), de modo que la tercera columna es un conflicto tanto en la primera como en la segunda columna (al mismo tiempo Lo mismo es cierto para dos a uno, y no ha cambiado), después de repetir de esta manera, annLa columna n se convierte en al menos una vaca de modo quennExiste un conflicto entre n columnas. (Si no existe, faltará al menos una columna).

Por supuesto, este método no requiere un número, así que honestamente usemos el método anterior.

Complejidad de tiempo: O (nlogn) O (nlogn)O ( n l o g n )

Código

Código:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define  N  51000
#define  M  1100000 
using  namespace  std;
typedef  pair<int,int> PII;
struct  node
{
    
    
	int  l,r,id;
}a[N];int  n;
int  b[M],ans=0,an[N],fuck[N];
inline  bool  cmp(node  x,node  y){
    
    return  x.l<y.l;}
priority_queue<PII,vector<PII>,greater<PII> >c;//小根堆
int  list[N],top=0;
int  main()
{
    
    
	scanf("%d",&n);
	for(int  i=1;i<=n;i++){
    
    scanf("%d%d",&a[i].l,&a[i].r);a[i].id=i;}
	sort(a+1,a+n+1,cmp);
	for(int  i=1;i<=n;i++)
	{
    
    
		fuck[a[i].id]=i;
		while(!c.empty()  &&  c.top().first<=a[i].l)list[++top]=c.top().second,c.pop();
		if(top>0)an[i]=list[top--];
		else  an[i]=++ans;
		c.push(make_pair(a[i].r+1,an[i]));
	}
	printf("%d\n",ans);
	for(int  i=1;i<=n;i++)printf("%d\n",an[fuck[i]]);
	return  0;
}

Código experimental, que consiste en probar si la idea detrás es correcta (por supuesto que es correcta, de lo contrario no se escribirá):

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define  N  51000
#define  M  1100000 
using  namespace  std;
typedef  pair<int,int> PII;
struct  node
{
    
    
	int  l,r,id;
}a[N];int  n;
int  b[M],ans=0,an[N],fuck[N];
inline  bool  cmp(node  x,node  y){
    
    return  x.l<y.l;}
priority_queue<PII,vector<PII>,greater<PII> >c;
int  list[N],top=0;

//试验区 
int  f[M];
inline  int  mymax(int  x,int  y){
    
    return  x>y?x:y;}
///
int  main()
{
    
    
	scanf("%d",&n);
	for(int  i=1;i<=n;i++){
    
    scanf("%d%d",&a[i].l,&a[i].r);a[i].id=i;f[a[i].l]++;f[a[i].r+1]--;}
	int  anss=0;
	for(int  i=1;i<=1000000;i++)anss=mymax(anss,f[i]+=f[i-1]);
	sort(a+1,a+n+1,cmp);
	for(int  i=1;i<=n;i++)
	{
    
    
		fuck[a[i].id]=i;
		while(!c.empty()  &&  c.top().first<=a[i].l)list[++top]=c.top().second,c.pop();
		if(top>0)an[i]=list[top--];
		else  an[i]=++ans;
		c.push(make_pair(a[i].r+1,an[i]));
	}
	printf("%d\n",anss);
	for(int  i=1;i<=n;i++)printf("%d\n",an[fuck[i]]);
	return  0;
}

resumen

De hecho, encontrará que ya sea este problema o el último protector solar, se resuelve clasificando lll orrr , y luego procesa otro.

Supongo que te gusta

Origin blog.csdn.net/zhangjianjunab/article/details/107746943
Recomendado
Clasificación