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 }

 

你可能感兴趣的:(sequence)