COJ1101(Sorting a Three-Valued Sequence)

题目链接

题目大意:给定一个只含1,2,3的数列,求排序的最小交换次数。

这题说不出需要用什么算法,如果有的话,应该是贪心的思想。

我的做法是,先统计1,2,3的个数,然后就知道了1,2,3应该排在哪些区间,首先将错位的两两交换(例如1在2的区间,2在1的区间),然后三个之间交换(例如1在2的区间,2在3的区间,3在1的区间)。

View Code
 1 #include <stdio.h>
 2 #include <memory.h>
 3 #define MIN(a,b)  ((a)<(b)?(a):(b))
 4 #define N 1000
 5 int a[N];
 6 int d[3][3];
 7 int main()
 8 {
 9   int i,n,x,ans;
10   while(~scanf("%d",&n))
11   {
12     memset(d,0,sizeof(d));
13     for(i=0;i<n;i++)
14     {
15       scanf("%d",&x);
16       a[i]=x;
17       d[x-1][x-1]++;
18     }
19     for(i=0;i<d[0][0];i++)  if(a[i]!=1) d[0][a[i]-1]++;
20     for(i=d[0][0];i<d[0][0]+d[1][1];i++)  if(a[i]!=2) d[1][a[i]-1]++;
21     for(i=d[0][0]+d[1][1];i<n;i++)  if(a[i]!=3) d[2][a[i]-1]++;
22     ans=0;
23     ans+=MIN(d[0][1],d[1][0])+MIN(d[0][2],d[2][0])+MIN(d[1][2],d[2][1]);
24     x=d[0][1]-d[1][0];
25     if(x<0) x=-x;
26     ans+=2*x;
27     printf("%d\n",ans);
28   }
29   return 0;
30 }

 

posted @ 2012-04-25 20:39  BeatLJ  阅读(242)  评论(0编辑  收藏  举报