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 }
然而,我并不能保证我说的是对的。请自行验证,如有错误,请指正
新博客地址
https://www.oyohyee.com
https://www.oyohyee.com