Uva 1368.DNA Consensus String

题目要求是对几个字符串进行分析,得到一个最优的字符串,使它满足与要求的字符串不同的字符之和最小。如果有多种解,则输出字典序最小的。

注意:字符串的结束时 \0  一定要加上

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 const int maxn=1005;
 7 char DNA[55][maxn];
 8 struct node{
 9     int i;
10     char n;
11     bool operator < (const node rhs)const{
12         return i<rhs.i || (i==rhs.i && n>rhs.n);
13     }
14 };
15 
16 void Do();
17 int Hamming(char s1[],char s2[],int len);
18 
19 int main(){
20     //freopen("in.txt","r",stdin);
21     int N;
22     scanf("%d",&N);
23     for(int i=0;i<N;i++)
24         Do();
25     return 0;
26 }
27 
28 void Do(){
29     int m,n;
30     scanf("%d%d",&m,&n);
31     int A[maxn],C[maxn],G[maxn],T[maxn];
32     memset(A,0,sizeof(A));
33     memset(C,0,sizeof(C));
34     memset(G,0,sizeof(G));
35     memset(T,0,sizeof(T));
36 
37     for(int i=0;i<m;i++){
38         scanf("%s",DNA[i]);
39         for(int j=0;j<n;j++){
40             if(DNA[i][j]=='A')A[j]++;
41             if(DNA[i][j]=='C')C[j]++;
42             if(DNA[i][j]=='G')G[j]++;
43             if(DNA[i][j]=='T')T[j]++;
44         }
45     }
46     char DNA_min[maxn];
47     for(int i=0;i<maxn;i++)
48         DNA_min[i]='\0';
49     for(int i=0;i<n;i++){
50         node a[4]={{A[i],'A'},{C[i],'C'},{G[i],'G'},{T[i],'T'}};
51         sort(a,a+4);
52         DNA_min[i]=a[3].n;
53     }
54 
55     int ans=0;
56     for(int i=0;i<m;i++){
57         ans+=Hamming(DNA_min,DNA[i],n);
58     }
59     printf("%s\n%d\n",DNA_min,ans);
60     return;
61 }
62 
63 int Hamming(char s1[],char s2[],int len){
64     int ans=0;
65     for(int i=0;i<len;i++)
66         if(s1[i]!=s2[i])
67             ans++;
68     return ans;
69 }

 

posted @ 2016-01-10 20:42  OhYee  阅读(327)  评论(0编辑  收藏  举报