DNA Sorting
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 854 Accepted Submission(s): 442
Problem 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.
This problem contains multiple test cases!
The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.
The output format consists of N output blocks. There is a blank line between output blocks.
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.
This problem contains multiple test cases!
The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.
The output format consists of N output blocks. There is a blank line between output blocks.
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 (1 < 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''. If two or more strings are equally sorted, list them in the same order they are in the input file.
Sample Input
1
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
Sample Output
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
数据很弱,该题要求输出稳定排序,所以这里采用了bobblesort,看了大家都是 0MS过的,呵呵,暴力去!!
代码如下:
#include <iostream>
using namespace std;
char str[105][55];
int rec[105][2]; // 0 号元素用来存储下标,1 号元素用来存储逆序值
int get( char *s, int len )
{
int ans= 0;
for( int i= 0; i< len- 1; ++i )
{
for( int j= i+ 1; j< len; ++j )
{
if( s[i]> s[j] )
{
ans++;
}
}
}
return ans;
}
void swap( const void *a, const void *b, int size )
{
char *x= ( char * )a, *y= ( char * )b;
for( int i= 0; i< size; ++i )
{
char c= *x;
*x= *y;
*y= c;
x+= 1, y+= 1;
}
return;
}
void bsort( int rec[][2], int m )
{
for( int i= 0; i< m- 1; ++i )
{
for( int j= 0; j< m- i- 1; ++j )
{
if( rec[j][1]> rec[j+ 1][1] )
{
swap( rec[j], rec[j+ 1], sizeof( rec[0] ) );
}
}
}
return;
}
int main( )
{
int N;
cin>>N;
while( N-- )
{
int n, m;
cin>> n>> m;
for( int i= 0; i< m; ++i )
{
cin>> str[i];
rec[i][0]= i;
rec[i][1]= get( str[i], n );
// cout<< rec[i][1]<< endl;
}
bsort( rec, m );
for( int i= 0; i< m; ++i )
{
cout<< str[ rec[i][0] ]<< endl;
}
if( N> 1 )
{
cout<< "\n";
}
}
return 0;
}