PKU ACM 1007题“DNA Sorting”的一种解法
2009-11-03 17:48
260 查看
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. 算法设计
{
int i, j, k;
scanf("%d %d/n",&n,&m); /*读入n和m*/
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;
}
{
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. 结论
本题不需要对字符串排序,也不必自己写排序函数。
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); /*读入n和m*/
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. 结论
本题不需要对字符串排序,也不必自己写排序函数。
相关文章推荐
- DNA Sorting-PKU ACM 1007
- acm pku 1007 DNA Sorting
- Pku acm 1007 DNA Sorting 排序算法解题报告(五)----求逆序数 排序
- PKU ACM- 1007 题 java DNA Sorting
- acm hnu 10415 分硬币的一种解法(递归遍历二叉树的方法,超时)
- ACM题“Harry Potter and His Magic Scroll”的一种解法
- 北大 ACM 1007 DNA Sorting
- ACM 1007 DNA Sorting
- PKU_1007_DNA Sorting
- 南邮ACM 1007 完美立方 JAVA解法
- 北大 ACM 1007 DNA Sorting
- pku 1007 DNA Sorting
- PKU 1007 DNA Sorting
- 炮兵阵地(acm.pku1185)解法
- PKU_1007 DNA sorting
- pku acm 1007
- 1007 DNA Sorting
- ACM UVa 算法题 #507 - Jill Rides Again的解法
- POJ-1007:DNA Sorting
- Pku acm 1088 滑雪 动态规划题目解题报告(十五)