题目描述
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
题目中规定了只可以用0来与其他数来进行交换,则算法如下:
使用贪心算法,如果0不在第0位,则说明0占据了第i位的位置,应该与第i的数的位置进行交换
如果0在第0位,查找序列中有无数字i不在第i位的,如果有则将0与第一个符合上述要求的数字的位置进行交换;如果没有说明序列有序结束算法。
满分代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i++){//数x在第i个位置上
int x;
cin>>x;
a[x]=i;//记录位置
}
int cnt=0,index=1;
while(true){
while(a[0]!=0){//当0不在0的位置上时,与相应的数字放到指定的位置上
swap(a[0],a[a[0]]);
cnt++;
}
for(;index<n;index++){
if(a[index]!=index){
swap(a[0],a[index]);
cnt++;
break;
}
}
if(index==n) break;
}
cout<<cnt<<endl;
return 0;
}