POJ1007 DNA Sorting (求逆序数)

【题目】:DNA Sorting

 

【来源】:点击打开链接

【解法】:

(1)我的做法(朴素做法效率低O(n2)):这题我做的比较直接,对每个字符串两层循环挨个扫描计算出其总的unsortness的总值,然后快排后顺序输出

        

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef struct Sn
{
	char s[101];
    int num;	
}SN;
SN data[51];

bool cmp(SN a,SN b)
{
	return a.num < b.num;
}

int main(){
	//freopen("input.txt","r",stdin);
	
	int len,n,i,j,k;
	while(~scanf("%d %d",&len,&n))
	{
		for(i=0;i<n;i++)
		{
			scanf("%s",data[i].s);
			data[i].num=0;
		}
			
		for(i=0;i<n;i++)
		{
			for(j=0;j<len;j++)
			{
				for(k=j+1;k<len;k++)
				    if(data[i].s[k]<data[i].s[j]) data[i].num++;
			}
		}
		sort(data,data+n,cmp);
		for(i=0;i<n;i++)
		    printf("%s\n",data[i].s);
	}
	return 0;
}

 

(2)参考做法一(O(n)):

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef struct Sn
{
	char s[101];
    int num;	
}SN;
SN data[51];

bool cmp(SN a,SN b)
{
	return a.num < b.num;
}

int main(){
	//freopen("input.txt","r",stdin);
	
	int len,n,i,j,k,p[4];
	while(~scanf("%d %d",&len,&n))
	{
		for(i=0;i<n;i++)
		{
			scanf("%s",data[i].s);
			data[i].num=0;
		}
			
		for(i=0;i<n;i++)
		{
			int cnt=0;
			memset(p,0,sizeof(p));
			for(j=len-1;j>=0;j--)
			{
				switch(data[i].s[j])
				{
					case 'A':p[0]++;break;
					case 'C':p[1]++;cnt+=p[0];break;
					case 'G':p[2]++;cnt+=(p[0]+p[1]);break;
					case 'T':p[3]++;cnt+=(p[0]+p[1]+p[2]);break;
				}
			}
			data[i].num=cnt;
			//printf("%s %d\n",data[i].s,data[i].num);
		}
		//qsort(data,n,sizeof(data[0]),cmp);
		sort(data,data+n,cmp);
		for(i=0;i<n;i++)
		    printf("%s\n",data[i].s);
	}
	return 0;
}


(3)还有n种做法:线段树,树状数组,归并排序

posted on 2013-07-05 12:19  Gddxz  阅读(197)  评论(0编辑  收藏  举报

导航