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
- Solo 1 elemento: no se requiere intercambio
- N0 elementos en el anillo, incluido 0: requiere n0–1 intercambios
- 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;