【题目】: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种做法:线段树,树状数组,归并排序