算法1
一
二
三
四
五
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e5+5;
int a[N];
bool st[N];
int main(){
int n;
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i];
}
int cnt=0;
for(int i=1;i<=n;i++){
if(!st[i]){
cnt++;
for(int j=i;!st[j];j=a[j]){//位置j指向a[j]的元素
st[j]=true;
}
}
}
cout << n-cnt;
}
这个第四例 有啥用。。。 感觉图文不搭
# 为什么这是对的呢
用y总的思路就能解释, y总求的n - k是最少操作数, 但是并不需要知道每个环内部具体怎么操作。 上面的代码模拟的就是把>=2的点的置换拆分成只含一个点的自环
还是不是很懂,我想问下怎么定义环的。等答复!
你模拟一下过程就知道了,把整个运行过程手动模拟一遍
为什么不能用逆序对,归并思想
如果这题是相邻的交换,就可以用逆序对了。因为相邻交换,每次交换可以消灭一个逆序对。可这一题任意交换两个元素可能消除消灭多个逆序对。例如5 2 3 4 1。只需交换一次5和1,所有的逆序对就全消除了
哦噢还真是,谢谢老哥
清晰
感谢支持!(ง •_•)ง