PAT 1067 Sort with Swap(0, i)

Posted mr-stn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 1067 Sort with Swap(0, i)相关的知识,希望对你有一定的参考价值。

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.

Input Specification:

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.

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 }

 



以上是关于PAT 1067 Sort with Swap(0, i)的主要内容,如果未能解决你的问题,请参考以下文章

PAT Advanced 1067 Sort with Swap(0,*) (25) [贪?算法]

PAT 甲级 1067 Sort with Swap(0, i) (25 分)(贪心,思维题)*

1067. Sort with Swap(0,*) (25)贪心——PAT (Advanced Level) Practise

PAT (Advanced Level) 1067. Sort with Swap(0,*) (25)

1067 Sort with Swap(0, i) (25 分)

1067 Sort with Swap(0, i) (25 分)难度: 中 / 知识点: 置换群