题目
Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasing order. But what if
Swap(0, *)
is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:Swap(0, 1) => {4, 1, 2, 0, 3} Swap(0, 3) => {4, 1, 2, 3, 0} Swap(0, 4) => {0, 1, 2, 3, 4}
Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.
输入
Each input file contains one test case, which gives a positive N (≤) followed by a permutation sequence of {0, 1, ..., N−1}. All the numbers in a line are separated by a space.
输出
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
样例输入
10
3 5 7 2 6 4 9 0 8 1
样例输出
9
题意理解
题意是给你一系列的数字序列 然后你只能通过0和某个位置的数字进行交换 问最少交换几次才能将整个序列变得有序
那么我们可以贪心的局部考虑
因为他题目给了0到n-1 那么也就是说我们每个位置上面必定是占了一个数字的
不管它是多少 并且一定把0到n-1这个区间给占满的
如果这个位置上面的数并不是它本身应该在的 那么我们需要通过0和那个位置的序列来进行交换
如果我们0不在0的位置上面,我们就把现在那个0在的那个位置给交换过来,直到我们0的位置归位
那么0归位以后如果 a[i]还是没有换到应该换到的位置的话 此时就需要借助0 将那个数换到我们需要它占的那个位置
那么每交换一次 cnt++
最后就是我们交换的总次数了
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int cnt=0;
int main(){
int n;
scanf("%d",&n);
for(int i=0,x;i<n;i++){
scanf("%d",&x);
a[x]=i;
}
for(int i=0;i<n;i++){
if(a[i]!=i){
while(a[0]!=0){
swap(a[0],a[a[0]]);
cnt++;
}
if(a[i]!=i){
swap(a[0],a[i]);
cnt++;
}
}
}
cout<<cnt<<endl;
return 0;
}