1. 程式人生 > >洛谷 Sorting a Three-Valued Sequence 三值的排序

洛谷 Sorting a Three-Valued Sequence 三值的排序

type 圖片 spl %d for 分享圖片 序列 b- color

Description

排序是一種很頻繁的計算任務。現在考慮最多只有三值的排序問題。一個實際的例子是,當我們給某項競賽的優勝者按金銀銅牌序的時候。 在這個任務中可能的值只有三種1,2和3。我們用交換的方法把他排成升序的。 寫一個程序計算出,給定的一個1,2,3組成的數字序列,排成升序所需的最少交換次數。

Input

Line 1: N (1 <= N <= 1000) Lines 2-N+1: 每行一個數字,共N行。(1..3)

Output

共一行,一個數字。表示排成升序所需的最少交換次數。

Sample Input

9
2
2
1
3
3
3
2
3
1

Sample Output

4

這個題以前做過一次,現在在鞏固一下。

對於不在正確位置的數字,會有兩種方式,一種是 “ 1 3 2 ”(有一個數字在正確位置),這樣只需要交換一次即可,另一種是“ 3 1 2 ”(三個數字都不在正確的位置),這樣需要交換兩次。
如果全部的第一種方式已經修正完畢,那麽剩下的就只有第二種方式了。

將線段劃分成三個區間,然後將這三個區間抽象成三個點,轉化為“ 1 2 3 ”這三個數的排列方式。

技術分享圖片
  1 #include<cstdio>
  2 #include<cstdlib>
  3 #include<cstring>
  4 #include<string
> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<stack> 9 #include<deque> 10 #include<map> 11 #include<iostream> 12 using namespace std; 13 typedef long long LL; 14 const double pi=acos(-1.0); 15 const double e=exp(1);
16 const int N = 10009; 17 18 struct num{ 19 int a; 20 int b; 21 int c; 22 }num[4]; 23 int con[1009]; 24 int main() 25 { 26 int i,p,j,n; 27 int a,b,c,aa,bb,cc; 28 a=b=c=aa=bb=cc=0; 29 memset(num,0,sizeof(num)); 30 scanf("%d",&n); 31 for(i=1;i<=n;i++) 32 { 33 scanf("%d",&con[i]); 34 if(con[i]==1) 35 aa++; 36 else if(con[i]==2) 37 bb++; 38 else 39 cc++; 40 } 41 for(i=1;i<=aa;i++) 42 { 43 if(con[i]==1) 44 num[1].a++; 45 if(con[i]==2) 46 num[1].b++; 47 if(con[i]==3) 48 num[1].c++; 49 } 50 for(i=aa+1;i<=aa+bb;i++) 51 { 52 if(con[i]==1) 53 num[2].a++; 54 if(con[i]==2) 55 num[2].b++; 56 if(con[i]==3) 57 num[2].c++; 58 } 59 for(i=aa+bb+1;i<=n;i++) 60 { 61 if(con[i]==1) 62 num[3].a++; 63 if(con[i]==2) 64 num[3].b++; 65 if(con[i]==3) 66 num[3].c++; 67 } 68 69 // for(i=1;i<=3;i++) 70 // printf("%d %d %d\n",num[i].a,num[i].b,num[i].c); 71 72 int ans=0,mid; 73 74 if(num[1].b!=0&&num[2].a!=0) 75 { 76 mid=min(num[1].b,num[2].a); 77 ans+=mid; 78 num[1].b-=mid; 79 num[2].a-=mid; 80 } 81 if(num[1].c!=0&&num[3].a!=0) 82 { 83 mid=min(num[1].c,num[3].a); 84 ans+=mid; 85 num[1].c-=mid; 86 num[3].a-=mid; 87 } 88 if(num[2].c!=0&&num[3].b!=0) 89 { 90 mid=min(num[2].c,num[3].b); 91 ans+=mid; 92 num[2].c-=mid; 93 num[3].b-=mid; 94 } 95 96 ans+=(num[1].b+num[1].c+num[2].a+num[2].c+num[3].a+num[3].b)/3*2; 97 98 printf("%d\n",ans); 99 return 0; 100 }
View Code

洛谷 Sorting a Three-Valued Sequence 三值的排序