Given any permutation of the numbers {0, 1, 2,…, N−1}, it is easy to sort them in increasing order. But what if Swap(0, *)
is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:
Swap(0, 1) => {4, 1, 2, 0, 3} Swap(0, 3) => {4, 1, 2, 3, 0} Swap(0, 4) => {0, 1, 2, 3, 4}
Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.
Each input file contains one test case, which gives a positive N (≤105) followed by a permutation sequence of {0, 1, …, N−1}. All the numbers in a line are separated by a space.
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
10 3 5 7 2 6 4 9 0 8 1
9
#include<cstdio> #include<algorithm> using namespace std; int set[100010]; //数字的位置 int main() { int n; scanf_s("%d", &n); int temp; int left = 0; //记录除0外不在本位上的数字个数 for (int i = 0; i < n; i++) { scanf_s("%d", &temp); set[temp] = i; if (temp != i&&i) left++; } int ans = 0; //交换次数 int k = 1; //记录除0外最小的不在本位上的数字 while (left) { if (set[0]) { swap(set[0], set[set[0]]); left--; ans++; } else { while (k < n) { if (set[k] != k) { swap(set[0], set[k]); ans++; break; } k++; } } } printf("%d", ans); }