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 Nnonnegative integers.
Input Specification:
Each input file contains one test case, which gives a positive N (≤105) followed by a permutation sequence of {0, 1, ..., N−1}. All the numbers in a line are separated by a space.
Output Specification:
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.
Sample Input:
10
3 5 7 2 6 4 9 0 8 1
Sample Output:
9
题意:给你一个从0到n-1的序列,只能用0和别的数交换,问最少交换多少次,序列可以有序(升序)。
思路:可以这样想,因为只能拿0进行交换,那么只要0不在自己的位置上,那么就在谁位置上就跟谁还换呗~,直到0回到自己位置。回到自己位置后,就遍历这个序列啊,看谁还没有在自己的位置上,那么0就去跟他换啊,换完后,再重复上一步,直到0又回到自己位置上,最后结束的条件就是,所有的数都在自己位置上了。(ps:只要这个数回到了自己的位置,就不会乱跑了)
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> vec(n);
for(int i = 0; i < n; i++){
int temp;
scanf("%d", &temp);
vec[temp] = i;
}
int flag = 0;
for(int i = 1; i < n; i++){
if(vec[i] != i){
while (vec[0] != 0)
{
swap(vec[0], vec[vec[0]]);
flag++;
}
if(vec[i] != i){
swap(vec[i], vec[0]);
flag++;
}
}
}
printf("%d\n", flag);
return 0;
}