2.1.3 Sorting a Three-Valued Sequence
刚开始我以为是道难题,后来就想直接模拟算了吧,就记录下1 2 3的个数,分成了3个区间,然后先找1区间中的2,2是从2区间到3的找,找3就从3区间到2区间的找,这样一来1区间就全部是1了,找2区间中的3就没压力了。大概思路就这样。
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<stdlib.h> 5 #define max(a,b) a>b?a:b 6 #define min(a,b) a>b?b:a 7 #define INF 0x3f3f3f3f 8 #define Maxin 10000 9 int fang[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 10 int n; 11 int s[1005]; 12 int k[5]; 13 14 int main() 15 { 16 int x,y,ans=0; 17 memset(k,0,sizeof(k)); 18 scanf("%d",&n); 19 for(x=0;x<n;x++) 20 { 21 scanf("%d",&s[x]); 22 k[s[x]]++; 23 } 24 k[2]+=k[1]; 25 for(x=0;x<k[1];x++) 26 { 27 if(s[x]==2) 28 { 29 for(y=k[1];y<n;y++) 30 if(s[y]==1) 31 break; 32 if(y!=n) 33 { 34 ans++; 35 s[x]^=s[y]; 36 s[y]^=s[x]; 37 s[x]^=s[y]; 38 } 39 }else 40 if(s[x]==3) 41 { 42 for(y=n-1;y>=k[1];y--) 43 if(s[y]==1) 44 break; 45 if(y!=k[1]-1) 46 { 47 ans++; 48 s[x]^=s[y]; 49 s[y]^=s[x]; 50 s[x]^=s[y]; 51 } 52 53 } 54 } 55 for(x=k[1];x<k[2];x++) 56 { 57 if(s[x]==3) 58 for(y=k[2];y<n;y++) 59 if(s[y]==2) 60 { 61 ans++; 62 s[x]^=s[y]; 63 s[y]^=s[x]; 64 s[x]^=s[y]; 65 break; 66 } 67 } 68 printf("%d\n",ans); 69 return 0; 70 }