One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
Input
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.
Output
Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.
Sample Input
10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCATSample Output
CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
题意:输入n,m,有m行n个DNA,按逆序从小到,大输出,(EAG)E比A大比G小,故只有逆序为1,思路:归并排序我不理解,一开始只会冒泡求,但后来找到才理解一点
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; void mergesort(char x[],int begin,int end,int num); void merge(char x[],int begin,int mid,int end,int num); struct node { char a[52]; char b[52]; int sum; }mp[110]; char temp[52]; bool cmp(node x,node y) { return x.sum<y.sum; } int main() { int n,m,i,j;
cin>>n>>m; for(i=1;i<=m;i++) { cin>>mp[i].a; mp[i].sum=0; strcpy(mp[i].b,mp[i].a); mergesort(mp[i].b,0,n-1,i); } sort(mp+1,mp+1+m,cmp); for(i=1;i<=m;i++) { cout<<mp[i].a<<endl; } } void mergesort(char x[],int begin,int end,int num) { int mid; if(begin<end) { mid=(begin+end)/2; mergesort(x,begin,mid,num); mergesort(x,mid+1,end,num); merge(x,begin,mid,end,num); } } void merge(char x[],int begin,int mid,int end,int num) { int i,j,k=0; i=begin,j=mid+1; while(i<=mid&&j<=end) { if(x[i]<=x[j]) { temp[k++]=x[i++]; } else { mp[num].sum+=mid-i+1; temp[k++]=x[j++]; } } while(i<=mid) { temp[k++]=x[i++]; } while(j<=end) { temp[k++]=x[j++]; } for(i=0;i<k;i++) { x[begin+i]=temp[i]; } }