DNA Sorting
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 87954 | Accepted: 35353 |
Description
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
Output
Sample Input
10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT
Sample Output
CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA
分析:题目的意思就是找到m个长度为n的DNA序列的逆序数,然后按照逆序数从小到大的顺序将这m个DNA序列稳定排序输出、
稳定排序通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前
#include <iostream>
using namespace std;
struct DNA_Seq
{
int inverse_num;
char sequence[50];
};
int get_inverseNum(char seq[],int length) //求一个序列的逆序数
{
int num = 0;
for(int i = 0;i<length;i++)
{
if(seq[i] != 'A')
{
for(int j = i+1;j<length;j++)
{
if(seq[i]>seq[j])
num++;
}
}
}
return num;
}
int main()
{
int m = 0;
int n = 0;
while(cin>>n>>m)
{
DNA_Seq *DNA = new DNA_Seq[m];
for(int i = 0;i<m;i++)
{
cin>>DNA[i].sequence;
DNA[i].inverse_num = get_inverseNum(DNA[i].sequence,n);
}
for(int i = 0;i<m;i++) //冒泡排序
{
for(int j = i+1;j<m;j++)
{
if(DNA[i].inverse_num>DNA[j].inverse_num)
{
DNA_Seq tmp = DNA[i];
DNA[i] = DNA[j];
DNA[j]= tmp;
}
}
}
for(int i = 0;i<m;i++)
cout<<DNA[i].sequence<<endl;
}
return 0;
}