一. 题目
DNA Sorting
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 95052   Accepted: 38243

Description

One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).

You are responsible for cataloguing a sequence of DNA strings
(sequences containing only the four letters A, C, G, and T). However,
you want to catalog them, not in alphabetical order, but rather in order
of ``sortedness'', from ``most sorted'' to ``least sorted''. All the
strings are of the same length.

Input

The
first line contains two integers: a positive integer n (0 < n <=
50) giving the length of the strings; and a positive integer m (0 < m
<= 100) giving the number of strings. These are followed by m lines,
each containing a string of length n.

Output

Output
the list of input strings, arranged from ``most sorted'' to ``least
sorted''. Since two strings can be equally sorted, then output them
according to the orginal order.

Sample Input

10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT

Sample Output

CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA

Source

二. 题意
  • 给出长度为M的N个DNA序列
  • 算出每个DNA序列的逆序数
    • 例如: DNA序列 CBA, 其逆序数为

      • C > B > A,逆序数 +2
      • B > A, 逆序数 +1
      • 逆序数为3
  • 按逆序数从小到大输出每个DNA序列
  • 如果DNA序列逆序数相同,按原始顺序输出(而不是字符顺序)

三. 分析

  • 算法核心: 堆排序
  • 实现细节:
    • N最大为50,所以桶的个数最大为(50 * 50) / 2 = 1250
    • M最大为100,所以桶的容量最大为100
    • 算出每个DNA序列的逆序数,将其字符数组索引存入对应的逆序数所在桶中
    • 遍历所有桶,顺序输出结果

四. 题解

#include <stdio.h>

#define MIN_V(a, b) ((a) <= (b) ? (a) : (b))
#define MAX_V(a, b) ((a) >= (b) ? (a) : (b)) #define MAX_B 1251
#define MAX_S 51
#define MAX_M 101 int b[MAX_B][MAX_M];
int bi[MAX_B];
char bs[MAX_M][MAX_S]; int main(void)
{
int i, j, k, N, M;
int min_size = MAX_B, max_size = -; scanf("%d %d\n", &N, &M); for (i = ; i < MAX_B; i++) bi[i] = -; for (i = ; i < M; i++) {
int size = ;
scanf("%s\n", bs[i]); for (j = ; j < N; j++) {
for (k = j + ; k < N; k++) {
if (bs[i][j] > bs[i][k]) size++;
}
} b[size][++bi[size]] = i; min_size = MIN_V(min_size, size);
max_size = MAX_V(max_size, size);
} for (i = min_size; i <= max_size; i++) {
for (j = ; j <= bi[i]; j++) {
printf("%s\n", bs[b[i][j]]);
}
} return ;
}

[POJ] #1007# DNA Sorting : 桶排序的更多相关文章

  1. poj 1007:DNA Sorting(水题,字符串逆序数排序)

    DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 80832   Accepted: 32533 Des ...

  2. [POJ 1007] DNA Sorting C++解题

        DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 77786   Accepted: 31201 ...

  3. poj 1007 DNA Sorting

    DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 95437   Accepted: 38399 Des ...

  4. poj 1007 DNA sorting (qsort)

    DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 95209   Accepted: 38311 Des ...

  5. POJ 1007 DNA sorting (关于字符串和排序的水题)

    #include<iostream>//写字符串的题目可以用这种方式:str[i][j] &str[i] using namespace std; int main() {int ...

  6. poj 1007 DNA Sorting 解题报告

    题目链接:http://poj.org/problem?id=1007 本题属于字符串排序问题.思路很简单,把每行的字符串和该行字符串统计出的字母逆序的总和看成一个结构体.最后把全部行按照这个总和从小 ...

  7. POJ 1007 DNA Sorting(sort函数的使用)

    Description One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are ...

  8. DNA Sorting(排序)

    欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) DNA Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  9. poj 107 DNA sorting

    关于Java的题解,也许效率低下,但是能解决不只是ACGT的序列字符串 代码如下: import java.util.*; public class Main { public static void ...

随机推荐

  1. YTU 2610: A改错题--体检情况分析

    2610: A改错题--体检情况分析 时间限制: 1 Sec  内存限制: 128 MB 提交: 233  解决: 161 题目描述 注:本题只需要提交标记为修改部分之间的代码,请按照C++方式提交. ...

  2. HDU 4664 Triangulation(SG函数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4664 题意:给出一个n个点的凸包(不存在三点共线).每次可以选择两个点连线,但是任意两条线只能在顶点处 ...

  3. 《OD学hadoop》mac下使用VMware Fusion安装centos

    一. NAT模式网络访问 (1)在linux中输入命令ifconfig查看网络信息 (2)在mac中输入命令ifconfig查看网络信息 lo0: flags=<UP,LOOPBACK,RUNN ...

  4. java生成带html样式的word文件

    参考:http://blog.csdn.net/xiexl/article/details/6652230 最近在项目中需要将通过富文本编辑器处理过的文字转换为Word,查了很久,大家通常的解决办法是 ...

  5. Android应用更新升级实现

    介绍 在产品的开发中,android升级提示,下载更新是必备的功能,否则等用户被动去官方网,或者第三方商店提示,就为时已晚了. 原理 在用户每次打开应用的时候,都与服务器进行一次交互,获取版本信息,对 ...

  6. UVa 1626 (输出方案) Brackets sequence

    正规括号序列定义为: 空序列是正规括号序列 如果S是正规括号序列,那么[S]和(S)也是正规括号序列 如果A和B都是正规括号序列,则AB也是正规括号序列 输入一个括号序列,添加尽量少的括号使之成为正规 ...

  7. svn备份脚 本

    一直用这套脚本备份,脚本主体虽不是原创,但是从网上得到后因为不能运行也进行了些修改,前两天看到有人问关于SVN备份的问题,今天又把脚本整理了一下,解决了不能循环备份多个配置库的问题.希望对大家有所帮助 ...

  8. 内核打上yaffs2补丁遇到的问题

    移植yaffs2文件系统时,首先要在内核中添加对yaffs2的支持,使用命令:./patch-ker.sh c 内核目录时,出现下面错误: usage:  ./patch-ker.sh  c/l m/ ...

  9. SQLServer如何快速生成100万条不重复的随机8位数字

    最近在论坛看到有人问,如何快速生成100万不重复的8位编号,对于这个问题,有几点是需要注意的: 1.    如何生成8位随机数,生成的数越随机,重复的可能性当然越小 2.    控制不重复 3.    ...

  10. Informatica9.6.1在Linux Red Hat 5.8上安装遇到的有关问题整理_1

    1.  产品安装过程中提示无法创建Domain([ICMD_10033] Command [defineDomain] failed with error [[INFASETUP_10002]) 1) ...