poj 1007 dna逆序数

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

    大概意思就是求逆序数,然后按照逆序数从小到大排序。算是复习一下sort用法。

    这里因为只有四个字母,所以求逆序数可以直接从后往前遍历,遍历过程中记录这四个字母的个数,遍历到某一个位置时,当前的逆序数就是比它小的字母的个数的总和。

#include 
#include 
#include 
using namespace std;
struct strr
{
	char a[55];
	int s;
};
strr str[105];
int cmp(strr sa, strr sb)
{
	return sa.s <= sb.s;
}
int reversion(char a[], int l)
{
	int i, na = 0, nc = 0, nt = 0, ng = 0, sum = 0;
	for(i = l - 1 ; i >= 0 ; i--)
	{
		switch(a[i])
		{
			case 'A' : na++; break;
			case 'C' : nc++; sum += na; break;
			case 'G': ng++; sum += na; sum += nc; break;
			case 'T': nt++; sum += na ; sum += nc; sum += ng; break;
		}
	}
	//printf("%d\n", sum);
	return sum;
}
int main()
{
	int n, i, l;
	scanf("%d %d", &l, &n);
	for(i = 0 ; i < n ; i++)
	{
	    scanf("%s", str[i].a);
	    //str[i].s = reversion(str[i].a, l);
	}
	for(i = 0 ; i < n ; i++)
	{
	    str[i].s = reversion(str[i].a, l);
	}
	sort(str, str + n, cmp);
	for(i = 0 ; i < n ; i++)
	    printf("%s\n", str[i].a);
	return 0;
}



你可能感兴趣的:(模拟,数论)