DNA Consensus String
Time Limit: Unknown Memory Limit: Unknown
Total Submission(s): Unknown Accepted Submission(s): Unknown
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 序列,多开一行,用最下面一行存答案。
逐列求解:找到每一列出现频次最高的字母,将该字母存到最下面一行,然后顺便算出该列的偏差值并累加到总偏差值上。
感受:
读题很难受。
其实知道题目要干什么就很简单了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。