题解:这道题考一个贪心算法,每个将每个位置出现次数最多的那个字符作为待求字符串相应位置的字符的到相似度最高的字符串。先发自己写的吧,虽然感觉自己写的代码总是很麻烦。
#include<cstdio>
#include<string.h>
#define MAX 1010
#define MIN 60
int T, m, n;
int max;
char DNA[4] = {'A', 'C', 'G', 'T'};
int num[4];//统计每个字符出现个数用的整数数组
int count;
int main()
{
scanf("%d", &T);
while(T--)
{
count = 0;
max=0;
char ans[MAX];//待求字符串
char list[MIN][MAX];//待输入的串(开大一点保平安
memset(ans, 0, sizeof(ans));
scanf("%d%d", &m, &n);
for(int i=0; i<m; i++)
{
scanf("%s", list[i]);
}
for(int j=0; j<n; j++)
{
memset(num, 0, sizeof(num));
for(int i=0; i<m; i++)
{
switch(list[i][j]){
case 'A':
num[0]++;
break;
case 'C':
num[1]++;
break;
case 'G':
num[2]++;
break;
case 'T':
num[3]++;
break;
}
}
max=num[0];
ans[j] = DNA[0];
for(int k=0; k<4; k++)//将每个位置出现次数最多的字符合在一起作为ans
{
if(max<num[k])
{
max = num[k];
ans[j] = DNA[k];
}
}
}
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
if(ans[j] != list[i][j])
count++;
}
}
for(int i=0; i<n; i++)
printf("%c", ans[i]);
printf("\n%d\n", count);
}
return 0;
}