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
参考代码:
using namespace std;
const int maxn = 100010;
int A[maxn];
int main(){
int n;
scanf("%d", &n);
int left = n - 1;
int num;
for (int i = 0; i < n; ++i) {
scanf("%d", &num);
A[num] = i;
if(num == i && num != 0) left--;//如果除0外,又在本位的数,left减1
}
int k = 1;//存放除0外不在本位的最小数
int ans = 0;//记录交换次数
while(left > 0){//只要还有数不在本位
if(A[0] == 0){//如果0在本位,就寻找一个不在本位的数与0交换
while(k < n){
if(A[k] != k){ //找一个当前不在本位的数k
swap(A[0], A[k]); //将k与0交换
ans++;
break;
}
k++;
}
}
while(A[0] != 0){//只要0不再本位,就讲0与当前位置交换
swap(A[0], A[A[0]]); //将0与pos[0]交换
ans++; //交换次数加一
left--;
}
}
printf("%d\n", ans);
return 0;
}