题目大意:给定一个只含1,2,3的数列,求排序的最小交换次数。
这题说不出需要用什么算法,如果有的话,应该是贪心的思想。
我的做法是,先统计1,2,3的个数,然后就知道了1,2,3应该排在哪些区间,首先将错位的两两交换(例如1在2的区间,2在1的区间),然后三个之间交换(例如1在2的区间,2在3的区间,3在1的区间)。

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 }