序列“未排序程度”的一个计算方式是元素乱序的元素对个数。例如:在单词序列“DAABEC'”中,因为D大于右边四个单词,E大于C,所以计算结果为5。这种计算方法称为序列的逆序数。序列“AACEDGG”逆序数为1(E与D)——近似排序,而序列``ZWQM'' 逆序数为6(它是已排序序列的反序)。
你的任务是分类DNA字符串(只有ACGT四个字符)。但是你分类它们的方法不是字典序,而是逆序数,排序程度从好到差。所有字符串长度相同。
输入:
第一行包含两个数:一个正整数n(0<n<=50)表示字符串长度,一个正整数m(0<m<=100)表示字符串个数。接下来m行,每行一个长度为n的字符串。
输出:
输出输入字符串列表,按排序程度从好到差。如果逆序数相同,就原来顺序输出。
样例输入:
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
Source Code
Problem: 1007 | User: menger | |
Memory: 272K | Time: 0MS | |
Language: C++ | Result: Accepted |
- Source Code
#include<iostream> #include<string> using namespace std; struct { char dna[51]; int count; }node[100]; void insertsort(int n,int m) { int i; char c[51]; for(int w=0;w<n;w++) { for(int j=0;j<m;j++) c[j]=node[w].dna[j]; node[w].count=0; for(int j=1;j<m;j++) { i=j-1; char key=c[j]; while(i>=0 && c[i]>key) { c[i+1]=c[i]; i--; node[w].count++; } c[i+1]=key; } } } int main() { int n,m; cin>>m; cin>>n; for(int i=0;i<n;i++) cin>>node[i].dna; insertsort(n,m); //cout<<"*************"<<endl; while(true) { int min=1000000,k=-1; for(int i=0;i<n;i++) if(node[i].count<min) { min=node[i].count; k=i; } if(min==1000000) break; cout<<node[k].dna<<endl; node[k].count=1000000; } system("pause"); return 0; }