UVA1368解题报告

来源:互联网 发布:阮一峰博客 js面向对象 编辑:程序博客网 时间:2024/06/03 10:00

我的一个审题误区是以为要在这几个序列里找到ham值最小的,实际上并不是这样,他要的是一个最小的ham值的DNA序列,并不一定要在已有的DNA序列里。所以这个简单了不少,因为我们可以一列一列的比较,一列一个字符的输出。这省去了我的不少开销。要相似度最大输出每列出现频率最高的即可,因为只有四个字符用map映射即可。

附上AC代码Time 0ms

#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<map>#include<algorithm>using namespace std;const int maxm=50+10;const int maxn=1000+10;const char dna[]="TAGC";int main(){    int T;    scanf("%d",&T);    while(T--)    {        int m,n,ham=0;        map<char,int> mm[maxn];        string DNA[maxm];        scanf("%d %d",&m,&n);        for(int i=0;i<m;i++) cin>>DNA[i];        for(int i=0;i<n;i++)   //init            for(int j=0;j<4;j++)                mm[i][dna[j]]=0;        for(int i=0;i<n;i++)            for(int j=0;j<m;j++)            {                char c=DNA[j][i];                mm[i][c]++;            }        for(int i=0;i<n;i++)        {            int pos=0,ans=0;            for(int j=0;j<4;j++)            {                char c=dna[j];                int temp=mm[i][c];                if(temp>ans) { ans=temp; pos=j; }                else{ if(temp==ans){                    if(dna[j]<dna[pos]) pos=j;                    ans=temp; }                }            }            ham+=(m-ans);            printf("%c",dna[pos]);        }        printf("\n%d\n",ham);    }}


原创粉丝点击