您的位置:首页 > 其它

POJ1007 DNA Sorting (求逆序数)

2013-07-05 12:19 375 查看
【题目】: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种做法:线段树,树状数组,归并排序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: