题意:有m个长度为n的ACGT序列,求一个长度为n的序列,使得每一位与这m个序列相应位的距离和最小(相同为0,不同为1)(4 <= m <= 50, 4 <= n <= 1000)。
——>>统计每一位A、C、G、T出现的次数,取出现最多的。
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000 + 10;
int main()
{
int A[maxn], C[maxn], G[maxn], T[maxn], t, m, n, i, j;
char s[maxn];
scanf("%d", &t);
while(t--){
scanf("%d%d", &m, &n);
memset(A, 0, sizeof(A));
memset(C, 0, sizeof(C));
memset(G, 0, sizeof(G));
memset(T, 0, sizeof(T));
for(j = 0; j < m; j++){
scanf("%s", s);
for(i = 0; i < n; i++){
switch(s[i])
{
case 'A':{
A[i]++;
break;
}
case 'C':{
C[i]++;
break;
}
case 'G':{
G[i]++;
break;
}
case 'T':{
T[i]++;
break;
}
}
}
}
char ret[maxn];
int cnt = 0;
for(i = 0; i < n; i++){
int Max = -1, num;
if(A[i] > Max){
Max = A[i];
ret[i] = 'A';
num = A[i];
}
if(C[i] > Max){
Max = C[i];
ret[i] = 'C';
num = C[i];
}
if(G[i] > Max){
Max = G[i];
ret[i] = 'G';
num = G[i];
}
if(T[i] > Max){
Max = T[i];
ret[i] = 'T';
num = T[i];
}
cnt += m - num;
}
for(i = 0; i < n; i++) putchar(ret[i]);
printf("\n");
printf("%d\n", cnt);
}
return 0;
}