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 }
原文地址:https://www.cnblogs.com/Mered1th/p/10436236.html