[POJ] #1007# DNA Sorting : 桶排序

一. 题目
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

East Central North America 1998

 

二. 题意
  • 给出长度为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 = -1; 

    scanf("%d %d\n", &N, &M);
    
    for (i = 0; i < MAX_B; i++) bi[i] = -1;

    for (i = 0; i < M; i++) {
        int size = 0;
        scanf("%s\n", bs[i]);

        for (j = 0; j < N; j++) {
            for (k = j + 1; 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 = 0; j <= bi[i]; j++) {
            printf("%s\n", bs[b[i][j]]);
        }
    }

    return 0;
}

 

你可能感兴趣的:([POJ] #1007# DNA Sorting : 桶排序)