题目链接:https://vjudge.net/problem/UVA-1368
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4114
#include <iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { char a[52][1005]; int b[1005]; char c[1005]; int t,m,n,e; cin>>t; while(t--){ cin>>m>>n; getchar(); for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ a[i][j]=getchar(); } getchar(); } e=0; for(int l=0;l<n;l++){ memset(b,0,sizeof(b)); for(int i=0;i<m;i++){ for(int j=0;j<m;j++){ if(i==j) continue; if(a[i][l]==a[j][l]){ b[i]++; } } } int max=0,k=0; for(int i=0;i<m;i++){ if(max<b[i]) { max=b[i]; k=i; } } int cc=0; for(int i=0;i<m;i++){ if(b[i]==max){ c[cc++]=a[i][l]; } } int x=0; for(int i=0;i<cc;i++){ if(c[i]=='T'){ x=4; break; } } for(int i=0;i<cc;i++){ if(c[i]=='G'){ x=3; break; } } for(int i=0;i<cc;i++){ if(c[i]=='C'){ x=2; break; } } for(int i=0;i<cc;i++){ if(c[i]=='A'){ x=1; break; } } if(x==0) putchar(a[k][l]); else if(x==1) putchar('A'); else if(x==2) putchar('C'); else if(x==3) putchar('G'); else if(x==4) putchar('T'); if(b[k]!=(m-1)) e=(m-1)-b[k]+e; } cout<<endl<<e<<endl; } return 0; }
思路:
输入m个长度n列的字符串,输出m个字符串的每一列中频度最高的字符,如果存在多个频度相同的最高字符,则以字母序的方法输出最小的,这个题本身不难,不过需要同时抓住几个点,值得思考。
另:我的代码写得复杂了,首先字符串的输入直接用%s输入就很舒服,然后可以定义一个结构体存储ACGT,这样就可以避免字典序的问题,因为可以首先输出A如果没有则依次向后。