1067 Ordenar con Swap (0, i) (25 puntos)

1067 Ordenar con intercambio (0, i) (25 分)

Dada cualquier permutación de los números {0, 1, 2, ..., N − 1}, es fácil ordenarlos en orden creciente. Pero, ¿qué pasa si Swap (0, *) es la ÚNICA operación que se permite usar? Por ejemplo, para ordenar {4, 0, 2, 1, 3} podemos aplicar las operaciones de intercambio de la siguiente manera:

Swap(0, 1) => {4, 1, 2, 0, 3}
Swap(0, 3) => {4, 1, 2, 3, 0}
Swap(0, 4) => {0, 1, 2, 3, 4}

Ahora se le pide que encuentre el número mínimo de intercambios necesarios para ordenar la permutación dada de los primeros N enteros no negativos.

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba, que proporciona un N positivo (≤10
5
) seguido de una secuencia de permutación de {0, 1, ..., N − 1}. Todos los números en una línea están separados por un espacio.

Especificación de salida:
para cada caso, simplemente imprima en una línea el número mínimo de intercambios necesarios para ordenar la permutación dada.

Entrada de muestra:

10
3 5 7 2 6 4 9 0 8 1

Salida de muestra:

9

Solución de
sólo 0 intercambio, se convierte en una matriz de la orden dada de la matriz han intercambiado el mínimo requerido;
esta idea método de clasificación se intercambia en otra posición si 0, 0 y el cambio de cambio de posición, hasta un regreso a la posición 0 0;
si 0 está en la posición 0, intercambia 0 con cualquier número que no esté en la posición original y luego realiza la operación anterior;


La matriz dada consta de varios anillos; hay
3 tipos de anillos

  1. Solo 1 elemento: no se requiere intercambio
  2. N0 elementos en el anillo, incluido 0: requiere n0–1 intercambios
  3. Hay elementos ni en el anillo i-ésimo, excluyendo 0: cambie 0 al anillo primero, luego
    realice (ni + 1) –1 intercambio, un total de intercambios ni + 1

Si la secuencia de N elementos contiene anillos unitarios S, 1 anillo múltiple que contiene 0 y anillos múltiples K-1 distintos de cero, el número de intercambios es: N-S + K-2, esta fórmula por defecto es 0 al principio Dentro de un anillo multivariado;
si 0 está inicialmente en el anillo unitario 0, entonces todos los K son anillos multivariados libres de cero, y la fórmula es N-S + K;

1. Función de entrada

void input()
{
	cin>>N;
	for(int i=0;i<N;i++)
	{
		cin>>T[i];
		if(T[i]==i) S++;
		R[T[i]]=i;       //T[i]中i的位置在R[i]内 
	}
}

Guarde la matriz en T y almacene la posición de i en T en R [i], T [R [i]] es i,
y si el número está originalmente en su propia posición, es el anillo de la unidad, S cuenta +1;

2. Operación de bucle transversal
Primero determine si T [0] es 0 , en caso afirmativo, el resultado debe ser +2,
luego atraviese T, cada vez que se encuentre un número que no esté en la posición del número de secuencia, guárdelo en temp y asigne T [R [i]] Dé T [i], en este momento i se reduce a, luego i = R [i], continúe operando hasta que sea lo mismo que una temperatura, lo que indica que se ha completado el recorrido del bucle;

void calculate()
{
	//计算
	if(T[0]==0) flag=2;
	int K=0; 
	for(int i=0;i<N;i++)
	{
		if(T[i]!=i)
		{				
			int tmp=T[i];
			int t=i;
			int r=R[i];
			while(t!=tmp)      //t是当前的序号等于开头拿出的值。 
			{
				T[t]=T[r];
				//完成转移 
				t=r;
				r=R[t];
			}
			T[t]=tmp;
			K++;
		}
	}
	
	cout<<N-S+K-2+flag;
} 

Código completo

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn =100010;

int N;
int T[maxn];
int R[maxn];
int S=0;
int flag=0;
void input()
{
	cin>>N;
	for(int i=0;i<N;i++)
	{
		cin>>T[i];
		if(T[i]==i) S++;
		R[T[i]]=i;       //T[i]中i的位置在R[i]内 
	}
}

void calculate()
{
	//计算
	if(T[0]==0) flag=2;
	int K=0; 
	for(int i=0;i<N;i++)
	{
		if(T[i]!=i)
		{				
			int tmp=T[i];
			int t=i;
			int r=R[i];
			while(t!=tmp)      //t是当前的序号等于开头拿出的值。 
			{
				T[t]=T[r];
				//完成转移 
				t=r;
				r=R[t];
			}
			T[t]=tmp;
			K++;
		}
	}
	
	cout<<N-S+K-2+flag;
} 

int main()
{
 	input();
	calculate();
	
}

Resume
las tres clases del problema de clasificación en que el anillo de dificultad;
intercambio de operación de bucle primero ordenados en línea 0;
si hay un número N de elementos de anillo, requieren N-1 o de cambio puede todos homing;
si el anillo no es 0, el 0 puso el 1 + (N + 1) -1 intercambio en el anillo, un total de N + 1 intercambios;

Publicados 105 artículos originales · ganado elogios 6 · vistas 4939

Supongo que te gusta

Origin blog.csdn.net/BLUEsang/article/details/105612932
Recomendado
Clasificación