题目大意:输入 m 个长度均为 n 的 DNA 序列,求一个 Hamming 距离最小的序列,即最相似的序列,多解要求字典序最小。并输出距离。Hamming 距离等于字符不同的位置个数。
解题思路:统计所有 DNA 序列中每个位置出现各个字符的次数,记录出现最多的字符与次数,将这些字符连接起来就是所求序列,每个位置的 Hamming 距离为 DNA 序列个数减去最大次数,各位置相加即可。
卡了比较久,因为把样例复制到文件的时候忘记删除每行末尾的空格,导致多了一个 getchar(); 但提交后并不需要所以一直WA,坑,下次注意。
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
char DNA[55][1005];
int num[5][1005];
int max_[1005];
int str[1005];
int main() {
int T;
scanf("%d", &T);
while (T--) {
memset (DNA, '0', sizeof(DNA));
memset (num, 0, sizeof(num));
memset (max_, 0, sizeof(max_));
memset (str, 0, sizeof(str));
int m, n;
scanf("%d%d", &m, &n);
getchar();
for (int i = 0; i < m; i++)
gets(DNA[i]);
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++) {
if (DNA[i][j] == 'A') num[0][j]++;
if (DNA[i][j] == 'C') num[1][j]++;
if (DNA[i][j] == 'G') num[2][j]++;
if (DNA[i][j] == 'T') num[3][j]++;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < 4; j++)
if (num[j][i] > max_[i]) {
max_[i] = num[j][i];
str[i] = j;
}
int sum = 0;
for (int i = 0; i < n; i++){
sum += m - max_[i];
if (str[i] == 0) printf("A");
if (str[i] == 1) printf("C");
if (str[i] == 2) printf("G");
if (str[i] == 3) printf("T");
}
printf("\n%d\n", sum);
}
return 0;
}