【刘汝佳书】习题3-7 UVA1368

UVA刷题方法:https://blog.csdn.net/richenyunqi/article/details/80990535#commentBox

【2019.3.25】
上完了一天的课,被老师藐视一通,被生活暴捶一顿,
回到宿舍里,洗个热水澡,来一杯冷藏酸奶,敲一段代码,舒服……
……然后第一次提交就来了个Runtime error……

50*1000的测例不过关,一开始以为是输入数据过大,吓得我把所有cout都改成了printf,然后又吭哧吭哧改了半天,才发现下面这条错误提示:
Process returned -1073741819(0xc0000005)
上网搜了下发现这种情况一般是【指针/内存使用不当】,发现自己有个数组开小了,一直getchar估计越界了……

反正最后AC了,舒服……

思路是:
将输入数据看成一个字符方阵,对于每一列,需要找出该列出现次数最多的字符,并记录其出现的次数
最后用总字符个数(m*n)减去每一列的最大出现次数,得到Hamming距离和

num[i][j],用于储存第 i 列中,字符 j 的出现次数,j的取值只有四个,分别为【‘A’-‘A’】【’T‘-’A’】【‘G’-‘A’】【‘C’-‘A’】
DNA[4]是按字母序排列的,用于在num[][]中,比较出现次数的最大值

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int num[1010][30];
char DNA[4]={'A','C','G','T'};

int main()
{
    //freopen("C:\\Users\\summer\\Desktop\\output.txt","w",stdout);
    int T;
    scanf("%d",&T);
    getchar();
    int m,n;
    char c;
    while(T--) {
        scanf("%d %d", &m, &n);
        getchar();

        memset(num, 0, sizeof(num));

		//输入数据
        for(int i=0; i<m; i++) {
            for(int j=0; j<n; j++) {
                c=getchar();
                num[j][c-'A']++;	//记录第j列中,字符c的出现次数
            }
            getchar();
        }

		//输出数据
        int maxnum;		//第j列中,最大的出现次数
        int maxj;		//记录出现次数最多的字符序号,0=A,1=C,2=G,3=T
        int len=m*n;  	//用总字符个数减去各列的最大出现次数,得到Hamming
        for(int j=0; j<n; j++) {	//对于每一列
            maxnum=maxj=0;
            for(int k=0; k<4; k++) {	//对于每种字符(按字母序比较)
                if(num[j][DNA[k]-'A']>maxnum) {	
                    maxnum=num[j][DNA[k]-'A'];	//记录最大次数
                    maxj=k;
                }
            }
            printf("%c",DNA[maxj]);	//输出出现次数最多的字符
            len-=maxnum;	
        }
        printf("\n%d\n",len);	//输出Hamming距离和
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值