PAT 1067 Sort with Swap(0, i)

Given any permutation of the numbers {0, 1, 2,..., N1}, 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.

Input Specification:

Each input file contains one test case, which gives a positive N (≤) followed by a permutation sequence of {0, 1, ..., N1}. 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

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 int main(){
 5   int n, i, cnt=0, sp=0;
 6   vector<int> v(100000), idx(100000);
 7   scanf("%d", &n);
 8   for(i=0; i<n; i++){
 9     scanf("%d", &v[i]);
10     idx[v[i]] = i;
11     if(i==idx[i]) cnt++;
12   }
13   int begin=0;
14   while(cnt<n){
15     if(idx[0]!=0){
16       swap(v[idx[0]], v[idx[idx[0]]]);
17       swap(idx[0], idx[idx[0]]);
18       cnt++;
19     }else{
20       while(v[begin]==begin) begin++;
21       swap(idx[0], idx[v[begin]]); // 先交换序号再交换值
22       swap(v[0], v[begin]);
23     }
24       sp++;
25   }
26   cout<<sp<<endl;;
27   return 0;
28 }

 

posted @ 2018-09-02 18:06  赖兴宇  阅读(162)  评论(0编辑  收藏  举报