//統計逆序對數,用歸併排序來統計 O(nlgn) 應該比枚舉要快,不過在這題中應該不會體現,反而浪費了空間,不過算了,當練歸併排序<br />#include<iostream><br />#include<algorithm><br />#define INF 2147483647<br />using namespace std;<br />struct str<br />{<br />char source[100];//儲存原始序列<br />char s[100];<br />int misorder;<br />}DNA[101];<br />int len,n,_min,flag,cnt;//逆序對數<br />char T[100];<br />int merge_sort(char A[],int x,int y,char T[])//歸併排序<br />{<br />if(y-x > 1)<br />{<br />int m = (x+y) / 2;<br />int p = x,q = m,i = x;<br />merge_sort(A,x,m,T);<br />merge_sort(A,m,y,T);<br />while(p < m || q < y)<br />{<br />if(q >= y || (p < m && A[p] <= A[q]))<br />T[i++] = A[p++];<br />else<br />{<br />T[i++] = A[q++];<br />cnt += m - p;//統計逆序對數<br />}<br />}<br />for(i = x;i < y;++i)<br />A[i] = T[i];<br />}<br />return cnt;//返回逆序對數<br />}<br />int main()<br />{<br />//freopen("in.txt","r",stdin);<br />scanf("%d%d",&len,&n);</p><p>for(int i = 0;i < n;++i)<br />{<br />scanf("%s",DNA[i].s);<br />strcpy(DNA[i].source,DNA[i].s);<br />cnt = 0;<br />DNA[i].misorder = merge_sort(DNA[i].s,0,len,T);<br />}<br />//一開始我用qsort的結構體排序,以為很方便,結果WA,原因是qsort是不穩定的,當逆序數對相同時,它不能保證結構體中的其他內容仍然按照原始順序排列<br />//結果無奈就用了個最腦殘的O(n^2)排序……<br />for(int j = 0;j < n;++j)<br />{<br />_min = INF;<br />for(int i = 0;i < n;++i)<br />{<br />if(DNA[i].misorder < _min)<br />{<br />_min = DNA[i].misorder;<br />flag = i;<br />}<br />}<br />printf("%s/n",DNA[flag].source);<br />DNA[flag].misorder = INF;<br />}<br />return 0;<br />}