天天看点

1007 DNA Sorting(字符串+逆序数)

DNA Sorting

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 93936 Accepted: 37791

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      

Source

East Central North America 1998

题解: 计算逆序数,然后根据逆序数,对DNA序列进行排序。

输入m个长度为n的DNA序列,把他们按照逆序数从小到大稳定排序输出。

“稳定排序”就是当序列中出现A1==A2时,排序前后A1与A2的相对位置不发生改变。

在这里不能用简单sort。要stable_sort。因为sort排序如果逆序数相同则不分大小随机排序。

冒泡+ stable _sort==Accepted。

AC代码:

#include<stdlib.h>
#include<stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
struct DNA //**定义DNA结构体**/
{
	string str;//**这个方便,用多大就开多大空间**//
	int count;
}w[1001];
bool comp(DNA x,DNA y)//**调整排序方法**//
{
	return x.count<y.count;
}
int main()
{
	int s,n,i,j,k;
	scanf("%d %d",&s,&n);
	for(i=0;i<n;i++)
	{
	    cin>>w[i].str;//**由于C没有字符串,所以只能用C++**//
		w[i].count=0;
		for(j=0;j<=s-2;j++)//**选择排序**//
		{
			for(k=j+1;k<=s-1;k++)
			{
				if(w[i].str[j]>w[i].str[k]) w[i].count++;
			}
		}
	}
	stable_sort(w,w+n,comp);
	for(i=0;i<n;i++)
	{
		cout<<w[i].str<<endl;

	}
	return 0;
}                                    

AC2代码:

#include <iostream>
#include <cmath>
#include <algorithm>
#define MAX 100
using namespace std;

int sortedness(char *);
typedef struct DNA {
	char * str;
	int sortedness;
}dna;
int cmp(const void * a, const void * b){
	return (((dna*)a)->sortedness - ((dna*)b)->sortedness);
}

int main() {
	int length,rows;
	cin>>length>>rows;
	dna* arr = new dna[rows];
	for(int i=0;i<rows;i++){
		arr[i].str = new char[length+1];
		cin>>arr[i].str;
		arr[i].sortedness = sortedness(arr[i].str);
		//cout<<arr[i].sortedness<<endl;
	}
	qsort(arr,rows,sizeof(dna),cmp);
	for(int i=0;i<rows;i++){
		cout<<arr[i].str<<endl;
	}
	return 0;
}

int sortedness(char *str) {
	int a[4]={0,0,0,0};
	int cnt=0;
	for(int i=0;str[i]!='\0';i++){
		switch(str[i]) {
		case 'A':
			a[0]++;
			cnt+= a[1]+a[2]+a[3];
			break;
		case 'C':
			a[1]++;
			cnt+=a[2]+a[3];
			break;
		case 'G':
			a[2]++;
			cnt+=a[3];
			break;
		case 'T':
			a[3]++;
			break;
		}
	}
	return cnt;
}