mirror of
https://github.com/Estom/notes.git
synced 2026-02-03 02:23:31 +08:00
43 lines
994 B
C++
43 lines
994 B
C++
#include<bits/stdc++.h>
|
|
using namespace std;
|
|
int getMinSwaps(vector<int> v)
|
|
{
|
|
vector<int> v1(v); //将A内元素复制到B。
|
|
sort(v1.begin(), v1.end());
|
|
map<int,int> m;
|
|
int len = v.size();
|
|
for (int i = 0; i < len; i++)
|
|
{
|
|
m[v1[i]] = i; // 建立每个元素与其应放位置的映射关系
|
|
}
|
|
int loops = 0; // 循环节个数
|
|
vector<bool> flag(len, false); //初始化
|
|
//找出循环节的个数
|
|
for (int i = 0; i < len; i++)
|
|
{
|
|
if (!flag[i])
|
|
{
|
|
int j = i;
|
|
while (!flag[j]) //对环处理
|
|
{
|
|
flag[j] = true;
|
|
j = m[v[j]]; //原序列中j位置的元素在有序序列中的位置
|
|
}
|
|
loops++;
|
|
}
|
|
}
|
|
return len - loops;
|
|
}
|
|
vector<int> v;
|
|
int main()
|
|
{
|
|
int n,k;
|
|
cin>>n;
|
|
while(n--){
|
|
cin>>k;
|
|
v.push_back(k);
|
|
}
|
|
int num = getMinSwaps(v);
|
|
cout<<num<<endl;
|
|
return 0;
|
|
} |