DNA Consensus String

Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown

UVa 1368
UVa 1368


https://uva.onlinejudge.org/i...

Accepted Code

// Author : Weihao Long
// Created : 2017/12/20

#include "stdio.h"

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        char dna[51][1001];
        int m, n;
        scanf("%d%d", &m, &n);
        for (int i = 0; i < m; i++)
            scanf("%s", dna[i]);
        int a, t, g, c, count = 0;
        for (int u = 0; u < n; u++) {
            a = t = g = c = 0;
            for (int k = 0; k < m; k++) {
                switch (dna[k][u]) {
                case 'A':a++; break;
                case 'T':t++; break;
                case 'G':g++; break;
                case 'C':c++; break;
                }
            }
            if (a >= t && a >= g && a >= c) {
                dna[50][u] = 'A'; count += (m - a);
            }
            else if (c >= a && c >= t && c >= g) {
                dna[50][u] = 'C'; count += (m - c);
            }
            else if (g >= a && g >= t && g >= c) {
                dna[50][u] = 'G'; count += (m - g);
            }
            else if (t >= a && t >= g && t >= c) {
                dna[50][u] = 'T'; count += (m - t);
            }
        }
        dna[50][n] = '\0';
        printf("%s\n%d\n", dna[50], count);
    }
    return 0;
}

Notes

题意:
每组测试数据包含 m 条长度为 n 的 DNA 序列,输出一条长度为 n 的 DNA 序列,要求它与所有输入的 DNA 序列的总偏差值最小,若有多个答案则输出字典序最小的那条,并换行输出总偏差值。
(偏差值:例如“ATGC”与“ACGT”的偏差值为 2 ,因为从左向右的第 2 个和第 4 个字母不同)

思路:
准备工作:开个字符串数组,存放输入的 DNA 序列,多开一行,用最下面一行存答案。
逐列求解:找到每一列出现频次最高的字母,将该字母存到最下面一行,然后顺便算出该列的偏差值并累加到总偏差值上。

感受:
读题很难受。
其实知道题目要干什么就很简单了。


龙威昊
4 声望5 粉丝