DNA Sorting(Poj 1007)

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

问题分析:

将字符串的顺序按照逆序数大小进行排列。只需将每个字符串的逆序数求出再排序即可。

#include<iostream>
using namespace std;
struct tring
{
    char str[100];
    int res;
};
int main()
{
    int m,n;
    tring s[1000];
    cin>>m>>n;
    for(int i=0;i<n;i++)
    {
        cin>>s[i].str;
        s[i].res=0;
    }
    for(int i=0;i<n;i++)//求逆序数
    {
        int num=0;
        int A =0,G=0,C=0;
        for(int j=m-1;j>=0;j--)
        {
            switch (s[i].str[j]) {
                case 'A':
                    A++;
                    break;
                case 'C':
                    C++; num +=A;
                    break;
                case 'G':
                    G++; num+=(C+A);
                    break;
                    case 'T':
                  num+=(G+C+A);
                    break;
            }
        }
        s[i].res = num;
    }
    for(int i=0;i<n;i++)//排序
    {
        for(int j=i;j<n;j++)
        {
            if(s[i].res>s[j].res)
            {
                tring temp;
                temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        cout<<s[i].str<<endl;
    }
        return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42103959/article/details/80786437