Description
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.
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
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 ATCGATGCAT
Sample Output
CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAATTTGGCCAAA
题解:找出各字符串中错误排序次数是多少,累计错误排序次数是利用反序累加,利用反序,就知道当前字符与后面字符是否大小排序,若不是就累加后面小于它的字符,所有字符串都累加错误次序后就按照error排序从小到大。第一次的时候WA是因为没看到如果错误次数相等就按照原来顺序。。。然后改了cmp函数,让a.error>=b.error就不会出现错误相同顺序不同!
#include <iostream> #include <algorithm> #include <cstdio> #include <string> using namespace std; struct DNA{ string str; int error; }; int getError(string str){ int sum = 0; int count[4] = {0,0,0,0}; int len = str.length()-1; for(int i = len; i >=0 ;i--){ char temp = str.at(i); switch(temp){ case 'A':count[0]++;break; case 'C':count[1]++,sum=sum+count[0];break; case 'G':count[2]++,sum=sum+count[1]+count[0];break; case 'T':sum=sum+count[0]+count[1]+count[2];break; } } return sum; } bool cmp(DNA a,DNA b){ return a.error>=b.error?false:true; } int main(){ int n,m; cin>>n>>m; DNA d[105]; for(int i = 0; i < m ;i++){ string str;cin>>str; d[i].str = str;d[i].error = getError(str); } sort(d,d+m,cmp); for(int i = 0;i < m;i++){ cout<<d[i].str<<endl; } return 0; }