la3602(貪心)

/*
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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章