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.
Input Specification:
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.
Output Specification:
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
Sample Input:
10 3 5 7 2 6 4 9 0 8 1
Sample Output:
9
首先,如果0不在0位置,就不停把他换到当前位置值所在的位置,直到0回归0位置,如果还存在值与位置值不符合的点,肯定是成对存在的,不妨对0~n-1再扫一遍,拿题目样例来说,位置下标从0开始,最初是3572649081,0在7位置,那么就和7换一下,为3502649781,然后继续,直到变成0523649781,0回到0位置了,一共换了3步,排序还没结束,此时对1~n-1扫一遍,发现5的位置不对,0与5交换,为5023649781,此时换了4步了,继续刚才的操作终于变为0123456789,最后经过了9步变换。
代码:
#include <iostream> #include <cstdio> using namespace std; int main() { int n,d,c = 0,b = 0; int s[100005]; scanf("%d",&n); for(int i = 0;i < n;i ++) { scanf("%d",&d); s[d] = i; } while(s[0]) { int p = s[0]; s[0] = s[p]; s[p] = p; c ++; } for(int i = 0;i < n;i ++) { if(s[i] != i) { c ++; d = s[i]; s[i] = 0; s[0] = d; while(s[0]) { int p = s[0]; s[0] = s[p]; s[p] = p; c ++; } } } printf("%d",c); }