UVA 1368 DNA Consensus String
题意:先输入一个数代表接下来的输入数据的个数,然后输入m,n,表示有m个长度为n的字符串DNA序列。
要求输出:①使m个序列的hamming差最小的DNA序列
②输出m的序列的hamming总差值。
思路:①字符串输出:例如ATC,AGC,GCT,按需查找每个序列的相同位置的元素,
AAG,可得A出现是次数最多,第一个位置应该填A,
TGC,三个元素次数一样,按字典序输出,第二个位置为C,
CCT,可得第三个位置为C。
②hamming差值结果:第一个位置选A,则有2个元素不一样,hamming差值加2,
最后输出总的结果。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main()
{
int num,m,n,i,j,k,max,diff=0;
int numA,numC,numG,numT,curDiff;
char str[50][1000],c,resStr[1000];
scanf("%d",&num);
while(num--)
{
scanf("%d",&m);
scanf("%d",&n);
for(i=0;i<m;i++)
{
scanf("%s",&str[i]);
}
diff=0;
// printf("print:\n");
// for(i=0;i<m;i++)
// {
// printf("%s\n",str[i]);
// }
memset(resStr,'\0',sizeof(resStr));//刚刚忘了写这个就WA
for(i=0;i<n;i++)
{
numA=0,numC=0,numG=0,numT=0,max=0;
for(j=0;j<m;j++)
{
switch (str[j][i])
{
case 'A':
numA++;
break;
case 'C':
numC++;
break;
case 'G':
numG++;
break;
case 'T':
numT++;
break;
}
}
curDiff=0;
if(numA>=numC&&numA>=numG&&numA>=numT)
{
resStr[i]='A';
curDiff=numC+numG+numT;
}
else if(numC>=numG&&numC>=numT)
{
resStr[i]='C';
curDiff=numA+numG+numT;
}
else if(numG>=numT)//numG>numA&&numG>numC
{
resStr[i]='G';
curDiff=numA+numC+numT;
}
else
{
resStr[i]='T'; //
curDiff=numA+numG+numC;
}
diff=diff+curDiff;
}
printf("%s\n",resStr);
printf("%d\n",diff);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步