题意翻译
输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。两个等长字符串的Hamming距离等于字符不同的位置个数,如ACGT和GCGA的Hamming距离为22(左数第11、44个字符不同)。
输入整数m和n(4≤m≤50,4≤n≤1000),以及m个长度为nn的DNA序列,(只包含字母A、C、G、T),输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多解,要求字典序最小的解。
输入输出样例
Sample Input
3 
5 8 
TATGATAC 
TAAGCTAC
AAAGATCC 
TGAGATAC
TAAGATGT 
4 10 
ACGTACGTAC 
CCGTACGTAG 
GCGTACGTAT 
TCGTACGTAA
6 10 
ATGTTACCAT 
AAGTTACGAT 
AACAAAGCAA 
AAGTTACCTT 
AAGTTACCAA 
TACTTACCAA 
 
Sample Output
TAAGATAC 
7 
ACGTACGTAA 
6 
AAGTTACCAA 
12
 
思路
记录每一列的每一个A,G,C,T的数量,找到每一列的最大值,用行数减去这一列的最大值,就是Hamming距离,如果有多个解,按照字典序小的来选择,注意输出格式.
代码
 #include <stdio.h>
 #include <string.h>
 char str[55][1005];
// 只有4个字符,这里我使用26个字母的顺序来记录
 int arr[1005][30];
 int main() {
 	int T;
 	scanf("%d", &T);
 	while (T--) {
 		int r;
 		int c;
        // 注意初始化
 		memset(arr, 0, sizeof(arr));
 		memset(str, ' ', sizeof(str));
 		scanf("%d%d", &r, &c);
 		for (int i = 0; i < r; i++) {
 			scanf("%s", str[i]);
 			for (int j = 0; j < c; j++) {
                // 记录数量
 				arr[j][str[i][j] - 'A']++;
 			}
 		}
 		int max;
        // 记录距离
 		int num = 0;
 		for (int i = 0; i < c; i++) {
            // 初始化max为-1,便与判断
 			max = -1;
 			char c;
 			for (int j = 0; j < 30; j++) {
				 if (arr[i][j] > max) {
 					max = arr[i][j];
                     // 得到输出字符
 					c = j + 'A';
 				}
 			}
            // 因为我选择用26个字母顺序来记录,所以数组只有4个字母有效
 			if (max > 0)
 			 	num = num + r - max;
 			printf("%c", c);
 		}
 		printf("\n");
 		printf("%d\n", num);
 	}
 	return 0;
 }










