1067 Classificar com Swap (0, i) (25 pontos)

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

  1. Apenas 1 elemento: nenhuma troca é necessária
  2. N0 elementos no anel, incluindo 0: requer n0–1 swaps
  3. 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;

Publicado 105 artigos originais · ganhou elogios 6 · vista 4939

Acho que você gosta

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