/*
translation:
給出若干條由A,G,C,T組成的字符串。現在求一個字符串,使得它到每個給出的字符串的hamming距離最小
haming距離定義爲兩個字符串不同字符的個數。
solution:
貪心
很明顯,對於要求字符串的i位置上的字符來說,該字符必定在其它字符串上出現的字符最多。明白這一點也就沒有難度了。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000 + 5;
const char letter[] = {'A', 'C', 'G', 'T'};
char s[55][maxn];
int m, n, cnt[5];
int setNo(char c)
{
if(c == 'A') return 0;
if(c == 'C') return 1;
if(c == 'G') return 2;
if(c == 'T') return 3;
}
int main()
{
//freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &m, &n);
for(int i = 0; i < m; i++)
scanf("%s", s[i]);
char ans[maxn];
int p = 0;
int res = 0;
for(int i = 0; i < n; i++) {
memset(cnt, 0, sizeof(cnt));
int maxv = -1;
for(int j = 0; j < m; j++) {
int no = setNo(s[j][i]);
cnt[no]++;
maxv = max(maxv, cnt[no]);
}
int id;
for(id = 0; id < 4; id++)
if(cnt[id] == maxv) break;
for(int i = 0; i < 4; i++)
if(i != id) res += cnt[i];
ans[p++] = letter[id];
}
for(int i = 0; i < n; i++)
printf("%c", ans[i]);
printf("\n%d\n", res);
}
return 0;
}
la3602(貪心)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.