poj 1007:DNA Sorting(水题,字符串逆序数排序)

DNA Sorting
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 80832   Accepted: 32533

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. 

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

TTTTGGCCAA

TTTGGCCAAA

Source

 
  水题,字符串排序
  题意:给你m个长度为n的字符串,要求让你按照字符串的逆序数进行稳定排序。
    所谓逆序数,就是给定一个排列和一个标准次序,如果这个排列中有两个元素与标准次序不同,则称这是一个逆序,这个排列的所有逆序总数称为这个排列的逆序数。
  思路:定义一个结构体存储字符串和字符串的逆序数,在主程序里,输入字符串之后计算每一个字符串的逆序数。然后用sort进行排序,最后输出排序后的字符串。
  代码
 1 #include <iostream>

 2 #include <algorithm>

 3 using namespace std;  4 struct Str{  5     char s[51];  6     int n;  //逆序数个数

 7 };  8 bool cmp(const Str &a,const Str &b)  9 { 10     if(a.n<b.n) 11         return 1; 12     return 0; 13 } 14 int main() 15 { 16     int n,m,i,j; 17     Str str[101]; 18     while(cin>>n>>m){ 19         for(i=1;i<=m;i++)   //输入

20             cin>>str[i].s; 21         for(i=1;i<=m;i++){ 22             int num=0; 23             int A=0,C=0,G=0; 24             for(j=n-1;j>=0;j--){ 25                 switch(str[i].s[j]){    //计算逆序数

26                     case 'A':A++;break; 27                     case 'C':C++;num+=A;break; 28                     case 'G':G++;num+=A;num+=C;break; 29                     case 'T':num+=A;num+=C;num+=G;break; 30                     default:break; 31  } 32  } 33             str[i].n = num; 34  } 35         sort(str+1,str+m+1,cmp); 36         for(i=1;i<=m;i++) 37             cout<<str[i].s<<endl; 38  } 39     return 0; 40 }

 

Freecode : www.cnblogs.com/yym2013

你可能感兴趣的:(sort)