题目描述
考点: 贪心,置换群
思路: 这题可以使用贪心的方法进行交换。
可以这样交换:每次与0所在的位置的下标这个数进行交换,这样一定是最优的。但是如果在交换的过程中,0回到了自己的位置,但是没有排序成功,则需要再重新找一个不在自己位置上的数字与0进行交换。
这种思路就是使用置换群模型进行贪心的思路,可以看具体y总具体视频讲解有更深刻的认识。
这种代码实现有O(n)实现方法,但是硬生生自己写成了n^2的复杂度。主要是在重新找的时候又回头找了,造成了平方的复杂度,但其实有更简单的写法。
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5+10;
int p[N];
int main(){
int n;
cin>>n;
for(int i = 0;i < n;i++){
int id;
cin>>id;
p[id] = i;
}
int res = 0;
for(int i = 1;i < n;){
while(p[0]){
swap(p[0],p[p[0]]);
res++;
}
while(i < n && p[i] == i)i++;
if(i < n){
swap(p[0],p[i]);
res++;
}
}
cout<<res;
}