原题链接https://www.luogu.com.cn/problem/P8637
模拟 + 贪心
对于每一个位置上的位置进行遍历只要不满足就找到要找到的数的位置,然后进行交换就行
#include <iostream>
#include <map>
#include <cmath>
#include <vector>
#define ll long long
ll n;
const ll inf = 1e9;
void solve(){
ll n;
std::cin >> n;
std::vector<ll> op(n + 1);
std::map<ll,ll> pp;
for(ll i = 1; i <= n; i ++){
std::cin >> op[i];
pp[op[i]] = i;
}
ll res = 0;
for(ll i = 1; i <= n; i ++){
if(i != op[i]){
res ++;
ll jk = pp[i];//i原来的位置在哪儿
// ll kk = op[jk];//
pp[op[i]] = jk;//这个点的位置交换
pp[i] = i;
op[jk] = op[i];
op[i] = i;
}
}
std::cout << res << "\n";
return ;
}
int main(){
ll t = 1;
while(t --)
solve();
return 0;
}