计蒜客 三值排序

三值排序

 

排序是一种很频繁的计算任务。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。

写一个程序计算出,计算出的一个包括1、2、3三种值的数字序列,排成升序所需的最少交换次数。

输入第1行为类别的数量N(1≤N≤1000)

输入第2行到第N+1行,每行包括一个数字(1或2或3)。

输出包含一行,为排成升序所需的最少交换次数。

样例输入

9
2
2
1
3
3
3
2
3
1

样例输出

4

是一个贪心的思想。x=位置为1的地方非1的个数;y=位置为2的地方3的个数;z=位置为3的地方的2的个数。

ans=x+max(y,z);

 1 #include"iostream"
 2 #include"algorithm"
 3 #define MAX 10000
 4 using namespace std;
 5 
 6 int a[MAX],num[4];
 7 int n, n1,n2,n3;
 8 
 9 
10 void msort(int n, int *a)
11 {
12     for (int i = 0; i< num[1];i++)
13     {
14         if (a[i] != 1)
15             n1++;
16     }
17 
18     for (int i = num[1]; i< num[1]+num[2]; i++)
19     {
20         if (a[i] == 3)
21             n2++;
22     }
23 
24     for (int i = num[1] + num[2]; i<n; i++)
25     {
26         if (a[i] == 2)
27             n3++;
28     }
29 }
30 
31 int main()
32 {
33     n1 = n2 = n3 = 0;
34     cin >> n;
35     for (int i = 0; i<n; i++)
36     {
37         cin >> a[i];
38         num[a[i]]++;
39     }
40 
41     msort(n, a);
42 
43     if (n2>n3) n1 += n2;
44     else n1 += n3;
45     cout<< n1;
46 
47     system("pause");
48 }

 

posted @ 2016-06-02 12:35  SeeKHit  阅读(417)  评论(0编辑  收藏  举报