【1067 25 贪心】 Sort with Swap(0, i)
传送门
题意
给定一个长度为\(n\)的\(0\sim n-1\)的一个全排列, 只能进行\(0\)和其他数的交换,求出将序列通过这种交换变为\(0\sim n-1\)的形式的最少操作
数据范围
\(n\leq 10^{5}\)
题解
- 输入过程中将数组用作记录每个数组的位置
- 遍历每个值,先将\(0\)归位,如果当前的值不对应就和\(0\)交换
Code
#include<bits/stdc++.h>
using namespace std;
int main(){
int n; cin>>n;
vector<int>a(n);
for(int i=0;i<n;i++) {
int x; cin>>x;
a[x]=i;
}
int op=0;
for(int i=1;i<n;i++){
if(i!=a[i]){
while(a[0]!=0){
swap(a[0],a[a[0]]);
op++;
}
if(i!=a[i]) swap(a[0],a[i]),op++;
}
}
cout<<op;
return 0;
}

浙公网安备 33010602011771号