PAT A1067 Ordenar con Intercambiable (0, i) (25 分)

enlaces a los temas : https://pintia.cn/problem-sets/994805342720868352/problems/994805403651522560

题目描述
Dado cualquier permutación de los números {0, 1, 2, ..., N-1}, es fácil para clasificarlas en orden creciente. Pero lo que si Intercambiar (0, *) es la única operación que se le permite el uso? Por ejemplo, para ordenar {4, 0, 2, 1, 3} podemos aplicar las operaciones de intercambio de la siguiente forma:

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 encontrar el número mínimo de permutas necesidad de clasificar la permutación dada de los primeros N números enteros no negativos.

输入
Cada archivo de entrada contiene un caso de prueba, lo que da un N positivo (≤10 ^ 5) seguido por una secuencia de permutación de {0, 1, ..., N-1}. Todos los números en una línea están separadas por un espacio.

输出
Para cada caso, sólo tiene que imprimir en una línea el número mínimo de permutas hay que solucionar la permutación dada.

entrada de la muestra
10
. 3. 5. 7 0 2. 8. 6. 1. 4. 9

Ejemplo de salida
9

código

#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 100010;
int pos[maxn];

int main() {
	int n, ans = 0;
	scanf("%d", &n);
	int left = n - 1, num;
	for(int i = 0; i < n; i++) {
		scanf("%d", &num);
		pos[num] = i;
		if(num == i && num != 0) {
			left--;
		}
	}
	int k = 1;
	while(left > 0) {
		if(pos[0] == 0) {
			while(k < n) {
				if(pos[k] != k) {
					swap(pos[0], pos[k]);
					ans++;
					break;
				}
				k++;
			}
		}
		while(pos[0] != 0) {
			swap(pos[0], pos[pos[0]]);
			ans++;
			left--;
		}
	}
	printf("%d\n", ans);
	return 0;
}
Publicados 288 artículos originales · ganado elogios 12 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/Rhao999/article/details/104743151
Recomendado
Clasificación