1067 Classificar com troca (0, i) (25 分)
Dada qualquer permutação dos números {0, 1, 2,…, N-1}, é fácil classificá-los em ordem crescente. Mas e se Swap (0, *) for a ÚNICA operação permitida? Por exemplo, para classificar {4, 0, 2, 1, 3}, podemos aplicar as operações de troca da seguinte maneira:
Swap(0, 1) => {4, 1, 2, 0, 3}
Swap(0, 3) => {4, 1, 2, 3, 0}
Swap(0, 4) => {0, 1, 2, 3, 4}
Agora, você é solicitado a encontrar o número mínimo de trocas necessário para classificar a permutação fornecida dos primeiros N números não negativos.
Especificação de entrada:
Cada ficheiro de entrada contém um caso de teste, o que dá um N positivo (≤10
5
), seguido por uma sequência de permutação {0, 1, ..., N-1}. Todos os números em uma linha são separados por um espaço.
Especificação de saída:
para cada caso, basta imprimir em uma linha o número mínimo de trocas necessário para classificar a permutação fornecida.
Entrada de amostra:
10
3 5 7 2 6 4 9 0 8 1
Saída de amostra:
9
Solução de
apenas 0 intercâmbio, é convertido em uma matriz de ordem dada da matriz ter trocado o mínimo exigido;
esta ideia método de classificação é trocado em outra posição, se 0, 0 e a mudança de troca de posição, até que o retorno para a posição 0 0;
se 0 está na posição 0, troque 0 com qualquer número que não esteja na posição original e execute a operação acima;
A matriz fornecida consiste em vários anéis; existem
3 tipos de anéis
- Apenas 1 elemento: nenhuma troca é necessária
- N0 elementos no anel, incluindo 0: requer n0–1 swaps
- Existem ni elementos no i-ésimo anel, excluindo 0: altere 0 para o anel primeiro e depois
execute (ni + 1) –1 troca - um total de ni + 1 trocas
Se a sequência de elementos N contiver anéis unitários S, 1 anel múltiplo contendo 0 e K-1 anéis múltiplos diferentes de zero, o número de trocas será: N-S + K-2, esta fórmula será padronizada como 0 no início Dentro de um anel multivariado,
se 0 estiver inicialmente no anel unitário 0, todos os K serão anéis multivariados livres de zero e a fórmula será N-S + K;
1. Função 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]内
}
}
Salve a matriz em T e armazene a posição de i em T em R [i], T [R [i]] é i
e se o número estiver originalmente em sua própria posição, é o anel da unidade, S count +1;
2. Percorrendo a operação de toque
Primeiro, determine se T [0] é 0 , se sim, o resultado precisa ser +2; em
seguida, atravesse T, toda vez que encontrar um número que não esteja na posição do número de sequência, salve-o em temp e atribua T [R [i]] Dê T [i], neste momento i é reduzido para, então i = R [i], continue a operar até i ser o mesmo que uma temperatura, indicando que o percurso do loop está completo;
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
os três tipos do problema de classificação em que o anel dificuldade;
troca de operação de circuito primeira classificados na linha 0;
se há um número N de elementos de anel, requerem N-1 ou de troca poderão todos homing;
se o anel não é 0, o 0 colocar o 1 + (N + 1) -1 troca no anel, um total de N + 1 trocas;