题面:

解题:
我们拷贝一份数组b,用sort()函数将b排序;
用memo<int,int>,将a数组的各个值映射给其序号;
扫一遍a的各个元素,比对a[i]是否与b[i]相等,若不等,则用memo映射b[i],找到b[i]值对应a[i]的下标t,再实现数组a内i与t交换的效果,交换次数ans++。
AC代码奉上:
#include<iostream>
#include<algorithm>
#include<map>
#define MAXN 100005
using namespace std;
int n, ans = 0, a[MAXN] = { 0 }, b[MAXN] = { 0 };
map<int,int>memo;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
b[i] = a[i];
memo[a[i]] = i; //记录值的位置
}
sort(b + 1, b + n + 1);
for (int i = 1; i <= n; i++)
{
if(a[i]!=b[i]) //交换 a[i]与b[i]
{
a[memo[b[i]]] = a[i];
memo[a[i]] = memo[b[i]];
ans++;
}
}
cout << ans << endl;
return 0;
}