#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100001;
int pos[maxn]; //记录数字所在的位置,数组下标为数字,值为所在的位置
int main(){
int n, num;
cin >> n;
int left = n - 1; //记录除了0之外不在本位上的数字的个数
for(int i = 0; i < n; i++){
cin >> num;
pos[num] = i;
if(num == i && num != 0) left--;
}
int ans = 0; //记录交换次数
int k = 1; //k记录除0之外最小的不在本位上的数字
while(left > 0){ //只要还有不在本位上的数字就进入循环
if(pos[0] == 0){ //如果交换过程中0回到了它的位置
for(k; k < n; k++){ //从小到大寻找一个不在本位上的数字,与0交换
if(pos[k] != k){
swap(pos[0], pos[k]);
ans++;
break;
}
}
}
while(pos[0] != 0){
swap(pos[0], pos[pos[0]]); //如果交换过程中0不在它的位置,就和应该在这个位置的数字交换
ans++;
left--;
}
}
cout << ans << endl;
return 0;
}
A1067(又是一道贪心算法题)
最新推荐文章于 2020-03-10 13:59:56 发布