PKU ACM 1007题“DNA Sorting”的一种解法

 

PKU ACM 1007题“DNA Sorting”的一种解法

 

1.        题目

  http://acm.pku.edu.cn/JudgeOnline/problem?id=1007

 

2.        需求解析

a)        输入的第1行有2个正整数,即字符串长度n和字符串个数m

b)        n的值域是0 < n <= 50

c)        m的值域是0 < n <= 100

d)        随后输入m行字符串,每行长度为n

e)        字符串的逆序数定义为:在一个字符串中,如果一对字符的前后位置与大小顺序相反,即前面的字符大于后面的字符,那末它们就称为一个逆序。一个字符串中逆序的总数就称为这个字符串的逆序数。

f)          按字符串的逆序数的递增对字符串排序。

g)        当两个字符串的逆序数相同,则保持它们的原来顺序。

h)        输出排序后的字符串。

 

3.        数据结构设计

#define MAX_M 100

#define MAX_N (50+1)

typedef struct

{

  int reverse_rank; /*逆序数*/

  int initial_order; /*字符串的初始顺序号*/

} dna_attr;

 

dna_attr dna_attr_buffer[MAX_M];

char dna_str[MAX_M][ MAX_N];

int n; /*字符串长度*/

int m; /*字符串个数*/

 

4.        算法设计

4.1. main函数

void main()

{

int i, j, k;

scanf("%d %d/n",&n,&m); /*读入nm*/

for (i=0; i<m; i++)

{

gets(dna_str[i]); /*按行读入dna_str*/

 

dna_attr_buffer[i].initial_order = i;

/*计算逆序数*/

dna_attr_buffer[i].reverse_rank = 0;

for(j=0; j<n-1; j++)

{

for(k=j+1; k<n; k++)

if(dna_str[i][j]>dna_str[i][k]) dna_attr_buffer[i].reverse_rank++;

}

}

qsort(dna_attr_buffer, m, sizeof(dna_attr), compare); /*排序*/

for (i=0; i<m; i++) /*输出*/

{

printf("%s/n", dna_str[dna_attr_buffer[i].initial_order]);

}

return 0;

}

4.2. compare函数

int compare (const void *data1, const void *data2)

{

  int t = ((dna_attr *)data1)->reverse_rank - ((dna_attr *)data2)->reverse_rank;

  if (t == 0) t = ((dna_attr *)data1)->initial_order - ((dna_attr *)data2)->initial_order;

  return t;

}

5.        结论

 本题不需要对字符串排序,也不必自己写排序函数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值