UVa 1368 - DNA Consensus String

来源:互联网 发布:文本编辑 mac 编辑:程序博客网 时间:2024/05/01 06:32

总起来算是做了一天多了,昨天没有交题,这种状态可不好!    本题还是有个地方卡了,倒不是算法方面,还是对 getchar(); 的使用理解的不够深刻,有必要好好的去严扣定义,这个题关于找字典序最小的解的算法,我觉得我的做法还是比较巧妙的,就是突然一下子就有的想法,平时还是要养成多思考的习惯。  最后一点,貌似UVa 交题时 如果程序中有代码注释会被判CE,试了好几次了,这个以后要注意啊!

#include <stdio.h>#include <string.h>#include <ctype.h>char a[2000][2000];char b[2000];int num[2000][4];int main(){    int i,j,k,r,s,t,m,n,h,sum;    scanf("%d",&h);    for(k=1; k<=h; k++)    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        memset(num,0,sizeof(num));        scanf("%d %d",&m,&n);        getchar();        for(i=0; i<m; i++)            gets(a[i]);        //getchar();        for(i=0; i<m; i++)            for(j=0; j<n; j++)            {                if( a[i][j] == 'A' )                    num[j][0]++;                else if( a[i][j] == 'C' )                    num[j][1]++;                else if( a[i][j] == 'G' )                    num[j][2]++;                else if( a[i][j] == 'T' )                    num[j][3]++;            }         //printf("%d\n",num[0][0]);         t=0;         for(i=0; i<n; i++)         {             int max=-1000;             for(j=3; j>=0; j--)                if( num[i][j] >= max )                    {  max=num[i][j];    r=j;  }             if(r == 0)                 b[t++] = 'A';             else if(r == 1)                 b[t++] = 'C';             else if(r == 2)                 b[t++] = 'G';             else if(r == 3)                 b[t++] = 'T';         }         sum=0;         for(i=0; i<m; i++)             for(j=0; j<n; j++)                 if(a[i][j] != b[j])                    sum++;          printf("%s\n%d\n",b,sum);    }    return 0;}


0 0