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