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

Posted mered1th

tags:

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

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

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 Nnonnegative integers.

Input Specification:

Each input file contains one test case, which gives a positive N (10?5??) 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不在1号位,那么需要和0交换,直到整个序列都在数所对应的位置上,过程中只能用0交换,求最小交换次数

分析:贪心题,要次数最小,只要每次和0交换后到达所对应的位置,简单地说就是换一次就不用再换了。
这里要考虑两种情况,第一种是0不在0号位,那么找到0在的位置,比如在3号位,那么和三号位对应的数交换;
第二种是0在0号位,找到第一个不在本位上的数交换。

为了方便起见,数组用来存数的位置。如下所示:

t 4 1 2 0 3
a[] 3 1 2 4 0
 
 1 /**
 2 * Copyright(c)
 3 * All rights reserved.
 4 * Author : Mered1th
 5 * Date : 2019-02-26-10.19.41
 6 * Description : A1067
 7 */
 8 #include<cstdio>
 9 #include<cstring>
10 #include<iostream>
11 #include<cmath>
12 #include<algorithm>
13 #include<string>
14 #include<unordered_set>
15 #include<map>
16 #include<vector>
17 #include<set>
18 using namespace std;
19 const int maxn=100010;
20 int main(){
21 #ifdef ONLINE_JUDGE
22 #else
23     freopen("1.txt", "r", stdin);
24 #endif
25     int n,t,a[maxn]={0},num=0;
26     scanf("%d",&n);
27     int left=n-1;
28     for(int i=0;i<n;i++){
29         scanf("%d",&t);
30         a[t]=i;
31         if(t==i && t!=0) left--;
32     }
33     int j=1;
34     while(left){
35         int i;
36         if(a[0]==0){
37             for(;j<n;j++){
38                 if(a[j]!=j){
39                     swap(a[j],a[0]);
40                     num++;
41                     break;
42                 }
43             }
44         }
45         else{
46             swap(a[0],a[a[0]]);
47             num++;
48             left--;
49         }
50 
51     }
52     cout<<num;
53 
54     return 0;
55 }

 

 

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

PAT甲级——A1067 Sort with Swap(0, i)

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

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

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

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

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