DNA Sorting POJ - 1007

DNA Sorting
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 114211   Accepted: 45704

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

OJ-ID:
poj-1007

author:
Caution_X

date of submission:
20191010

tags:
水题

description modelling:
1.输入若干个字符串,按“有序”到“无序”顺序输出(这些串只含有A,C,G,T)
2.有序的定义为该串的逆序数,若逆序数相同,则按原来的顺序输出

major steps to solve it:
1.记录所在串各个字母的个数
2.遍历整个串,每次遍历到当前字母时加上与该字母逆序的字母的个数,然后该串中此字母个数-1
3.sort排序后输出
warnings:
1.注意审题,逆序数相同时按照原来的顺序输出
AC Code:
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
char a[110][50];
map<char,int> Num[110];
struct ANS{
    int d,p;
}ans[110];
int d[110];
bool cmp(ANS a,ANS b)
{
    if(a.d!=b.d) return a.d<b.d;
    else return a.p<b.p;
}
int main()
{
    //freopen("input.txt","r",stdin);
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++) {
        ans[i].p=i;
        for(int j=0;j<n;j++) {
            cin>>a[i][j];
            Num[i][a[i][j]]++;
        }
    }
    for(int i=0;i<m;i++) {
        ans[i].d=0;
        for(int j=0;j<n;j++) {
            if(a[i][j]=='A') {
                Num[i]['A']--;
            }
            else if(a[i][j]=='C') {
                ans[i].d=ans[i].d+Num[i]['A'];
                Num[i]['C']--;
            }
            else if(a[i][j]=='G') {
                ans[i].d=ans[i].d+Num[i]['A']+Num[i]['C'];
                Num[i]['G']--;
            }
            else if(a[i][j]=='T') {        
                ans[i].d=ans[i].d+Num[i]['C']+Num[i]['G']+Num[i]['A'];
                Num[i]['T']--;
            }
        }
    }
    sort(ans,ans+m,cmp); 
    for(int i=0;i<m;i++) {
        for(int j=0;j<n;j++) {
            cout<<a[ans[i].p][j];
        }
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/cautx/p/11651113.html