【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;
}
posted @ 2021-03-01 21:57  Hyx'  阅读(98)  评论(0)    收藏  举报