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

posted @ 2014-06-05 15:15  Freecode#  阅读(2443)  评论(0编辑  收藏  举报