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.
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:
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; }