1067 Sort with Swap(0, i) (25 分)
Posted mered1th
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1067 Sort with Swap(0, i) (25 分)相关的知识,希望对你有一定的参考价值。
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 (≤10?5??) 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不在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