Description
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候。 在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。 写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
Input
Line 1: N (1 <= N <= 1000) Lines 2-N+1: 每行一个数字,共N行。(1..3)
Output
共一行,一个数字。表示排成升序所需的最少交换次数。
Sample Input
9 2 2 1 3 3 3 2 3 1
Sample Output
4
解题思路:这是一道贪心题,分别统计1,2,和3出现的次数,分成1,2,和3的区间。贪心策略,每一次交换尽可能的使交换得到的数分配到
应该到的区域,这样才能得到最少交换次数。
上代码:
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int n,i,j,count1=0,count2=0,count3=0,count=0; 8 int a[10001]; 9 scanf("%d",&n); 10 for(i=0; i<n; i++) 11 { 12 scanf("%d",&a[i]); 13 if(a[i]==1)///分别统计1,2,3出现的次数,来划分区间 14 count1++; 15 if(a[i]==2) 16 count2++; 17 if(a[i]==3) 18 count3++; 19 } 20 for(i=0;i<count1;i++) 21 { 22 if(a[i]==2) 23 { 24 for(j=count1;j<n;j++) 25 { 26 if(a[j]==1) 27 { 28 swap(a[i],a[j]); 29 count++; 30 break; 31 } 32 } 33 } 34 if(a[i]==3) 35 { 36 for(j=n-1;j>=count1;j--) 37 { 38 if(a[j]==1) 39 { 40 swap(a[i],a[j]); 41 count++; 42 break; 43 } 44 } 45 } 46 }///1的区间里面将全部换成1 47 for(i=count1;i<count1+count2;i++) 48 { 49 if(a[i]==3) 50 { 51 for(j=count1+count2;j<n;j++) 52 { 53 if(a[j]==2) 54 { 55 swap(a[i],a[j]); 56 count++; 57 break; 58 } 59 } 60 } 61 }///2的区间里面将全部换成2,那么自然而然3的区间也都是3 62 printf("%d ",count); 63 return 0; 64 }