题意:
1. 给你一堆同长度的DNA链,要你计算他们共识错误(题目里说的什么汉明距离)最少的并且字典序最小的DNA链
2. 没有要求多组数据输入
思路:
1. 首先是对起到桶排序作用的数组a进行清零操作
2. 从左往右计算共识错误最少且字典序最小的DNA(用桶排序和选择法就可以解决字典序的问题)
3. 计算共识错误总和
4. 最后一定要加上字符串结束标记'\0'
我的AC代码如下:
//UVA-1368-DNA Consensus String
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[55][1005];
int a[5];
char s[5];
int main()
{
//freopen("in.txt","r",stdin);
s[1]='A';
s[2]='C';
s[3]='G';
s[4]='T';
int t;
//本题没有要求多组数据输入,我用了while(cin >> t)连wa几次,很气
cin >> t;
while(t--)
{
int n,m;
cin >> m >> n;
for(int i=0; i<m; i++)
cin >> str[i];
int sum=0,mina;
for(int i=0; i<n; i++)
{
memset(a,0,sizeof(a)); //清零记录数组
mina=0; //清零操作还是很重要的呀!
for(int j=0; j<m; j++)
{
if(str[j][i]=='A')
a[1]++;
if(str[j][i]=='C')
a[2]++;
if(str[j][i]=='G')
a[3]++;
if(str[j][i]=='T')
a[4]++;
}
for(int k=1; k<5; k++) //按字典序赋值
{
if(a[k]>mina)
{
mina=a[k];
str[m][i]=s[k];
}
}
sum=sum+m-mina; //计算共识错误总数
}
str[m][n]='\0'; //记得加上字符串结束标记
cout << str[m] << endl;
cout << sum << endl;
}
return 0;
}