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 }

posted on 2012-05-25 14:08  usp10  阅读(162)  评论(0编辑  收藏  举报

导航