uva1368

来源:互联网 发布:江西广电网络宽带投诉 编辑:程序博客网 时间:2024/06/07 00:01

题目大意:
给m个长度为n的DNA序列,求一个DNA序列到所有序列的总汉明距离最小,汉明距离为不同字符的位置的个数。

思路:
用贪心的方法,刚开始还以为是在给定的DNA中选出一个,可是并不是,是要求一个DNA序列可以使得它到给定的DNA序列的距离最小。每次都求出一列中最多相同的字母。

代码:

#include <iostream>using namespace std;#include <cstring>#include <stdio.h>char grid[1005];struct node {    int a,c,g,t;}N[1005];int main() {    int n,m;    int T;    scanf("%d",&T);    while(T--) {        scanf("%d %d",&n,&m);        for(int i = 0 ; i < m; i++)             N[i].a = N[i].c = N[i].g = N[i].t = 0;        for(int i = 0; i < n; i++) {            scanf("%s",grid);            for(int j = 0; j < m; j++) {                if(grid[j] == 'A') N[j].a++;                else if(grid[j] == 'C') N[j].c++;                else if(grid[j] == 'G') N[j].g++;                else if(grid[j] == 'T') N[j].t++;            }        }        char s[1005];        int maxx,ans = 0;        for(int i = 0; i < m; i++) {            s[i] = 'A';            maxx = N[i].a;            if(N[i].c > maxx) {                s[i] = 'C';                maxx = N[i].c;            }            if(N[i].g > maxx) {                s[i] = 'G';                maxx =N[i].g;            }            if(N[i].t > maxx) {                s[i] = 'T';                maxx = N[i].t;            }            ans += n - maxx;        }        s[m] = '\0';        printf("%s\n%d\n",s,ans);    }    return 0;}
0 0
原创粉丝点击