您的位置:首页 > 其它

UVA1368解题报告

2017-05-31 22:08 260 查看
我的一个审题误区是以为要在这几个序列里找到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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: