大概思路:fin读取时记录1,2,3对应个数,然后从buf[1]开始,枚举遍历。1,2,3最终位置和是由count[1..2..3]形成的3个区间,若buf[i]再对应区间,则continue;若不再,则遍历最终位置所在的区间,寻找是否存在两数交换恰好后都在最终位置的index,若有,交换,若无,随意选择一处交换,每次交换step++;又是一次ac,,^_^o~ 努力!
1 /* 2 3 ID: hubiao cave 4 5 PROG: sort3 6 7 LANG: C++ 8 9 */ 10 11 12 13 14 #include<iostream> 15 16 #include<fstream> 17 18 #include<string> 19 20 using namespace std; 21 22 23 int number; 24 int buf[1002]; 25 int cou[4]; 26 int step; 27 28 void proc(); 29 int swapdir(int index,int value); 30 int swap(int&,int&); 31 32 int main() 33 34 { 35 36 37 38 39 ifstream fin("sort3.in"); 40 41 ofstream fout("sort3.out"); 42 fin>>number; 43 for(int i=1;i<=number;i++) 44 { 45 fin>>buf[i]; 46 cou[buf[i]]++; 47 } 48 proc(); 49 fout<<step<<endl; 50 51 return 0; 52 53 54 } 55 void proc() 56 { 57 for(int i=1;i<=number;i++) 58 { 59 if(buf[i]==1) 60 { 61 if(i<=cou[1]) 62 continue; 63 else 64 { 65 swapdir(i,1); 66 } 67 } 68 if(buf[i]==2) 69 { 70 if(i<=cou[2]+cou[1]&&i>cou[1]) 71 continue; 72 else 73 swapdir(i,2); 74 } 75 if(buf[i]==3) 76 { 77 if(i<=cou[1]+cou[2]+cou[3]&&i>cou[1]+cou[2]) 78 continue; 79 else 80 swapdir(i,3); 81 } 82 } 83 } 84 85 int swapdir(int index,int value) 86 { 87 if(value==1) 88 { 89 int imper=0; 90 int pernum; 91 pernum=index>cou[2]+cou[1]?3:2; 92 93 94 for(int i=1;i<=cou[1];i++) 95 { 96 if(buf[i]==1) 97 continue; 98 else 99 { 100 if(buf[i]==pernum) 101 { 102 swap(buf[i],buf[index]); 103 step++; 104 return 0; 105 } 106 else 107 { 108 imper=i; 109 } 110 111 } 112 } 113 swap(buf[imper],buf[index]); 114 } 115 116 if(value==2) 117 { 118 int imper=0; 119 int pernum; 120 pernum=index<=cou[1]?1:3; 121 for(int i=cou[1]+1;i<=cou[1]+cou[2];i++) 122 { 123 if(buf[i]==2) 124 continue; 125 else 126 { 127 if(buf[i]==pernum) 128 { 129 swap(buf[i],buf[index]); 130 step++; 131 return 0; 132 } 133 else 134 { 135 imper=i; 136 } 137 138 } 139 } 140 swap(buf[imper],buf[index]); 141 } 142 143 if(value==3) 144 { 145 int imper=0; 146 int pernum; 147 pernum=index<=cou[1]?1:2; 148 for(int i=cou[1]+cou[2]+1;i<=cou[1]+cou[2]+cou[3];i++) 149 { 150 if(buf[i]==3) 151 continue; 152 else 153 { 154 if(buf[i]==pernum) 155 { 156 swap(buf[i],buf[index]); 157 step++; 158 return 0; 159 } 160 else 161 { 162 imper=i; 163 164 } 165 166 } 167 } 168 swap(buf[imper],buf[index]); 169 } 170 step++; 171 return 0; 172 } 173 174 int swap(int& a,int& b) 175 { 176 int t=a; 177 a=b; 178 b=t; 179 return 0; 180 }