题目:

链接

题意:

题目虽然比较长,但读完之后题目的思路还是比较容易想出来的。

给出m个长度为n的字符串(只包含‘A’、‘T’、‘G’、‘C’),我们的任务是得出一个字符串,要求这个字符串与给出的m个字符串的汉明距离的和最小,输出这个字符串和最小的汉明距离和。

如果有多个符合题意的字符串,就输出字典序最小的那个字符串。

思路:

1、首先给出汉明距离的定义:

汉明距离表示相同长度的字对应位不同的数量。

例如:

10100和11000的汉明距离就是2.

2、对m个字符串的每一位分别统计‘A’、‘T’、‘G’、‘C’的个数,则答案字符串这一位的字符就是m个字符串中这一位上个数最多的那个字符。这样保证答案字符串的这一位的字符和给出的所有字符串有最大的字符相同数,所以得出的汉明距离就会最小。

3、得到答案字符串之后,与每一个给出的字符串进行比较得到汉明距离的和。

代码:

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define FRE() freopen("in.txt","r",stdin)
using namespace std;
typedef long long ll;
const int maxn = 5e3+;
int mp[][];
char str[][]; int toTransform(char ch){
int res;
switch(ch){
case 'A':
res = ;
break;
case 'C':
res = ;
break;
case 'G':
res = ;
break;
case 'T':
res = ;
break;
}
return res;
} char toChar(int x){
char ch;
switch(x){
case :
ch = 'A';
break;
case :
ch = 'C';
break;
case :
ch = 'G';
break;
case :
ch = 'T';
break;
}
return ch;
} int toJudgeMaxPos(int r){
int idx = ,mmax = -inf;
for(int i = ; i<; i++){
if(mmax < mp[r][i]){
mmax = mp[r][i];
idx = i;
}
}
return idx;
} int toCountRes(char* sstr,int m,int n){
int res = ;
for(int i = ; i<n; i++){
for(int j = ; j<m; j++){
if(sstr[i] != str[j][i])
res++;
}
}
return res;
} int main(){
int T,m,n;
scanf("%d",&T);
while(T--){
scanf("%d%d",&m,&n);
for(int i = ; i<m; i++){
scanf("%s",str[i]);
} memset(mp,,sizeof(mp));
for(int i = ; i<n; i++){//统计m个字符串相同位上A、T、G、C的个数
for(int j = ; j<m; j++){
int idx = toTransform(str[j][i]);
mp[i][idx]++;
}
}
// for(int i = 0; i<m; i++){
// printf("%d %d %d %d\n",mp[i][0],mp[i][1],mp[i][2],mp[i][3]);
// }
char ans[];
for(int i = ; i<n; i++){//找出该位上相同个数最多的那个字符,并赋值给ans字符串
int pos = toJudgeMaxPos(i);
char temp = toChar(pos);
ans[i] = temp;
}
ans[n] = '\0';
// cout<<ans<<endl; int res = toCountRes(ans,m,n);//获取汉明距离
printf("%s\n%d\n",ans,res);
}
return ;
}
/*
PutIn:
3
5 8
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
4 10
ACGTACGTAC
CCGTACGTAG
GCGTACGTAT
TCGTACGTAA
6 10
ATGTTACCAT
AAGTTACGAT
AACAAAGCAA
AAGTTACCTT
AAGTTACCAA
TACTTACCAA
PutOut:
TAAGATAC
7
ACGTACGTAA
6
AAGTTACCAA
12
*/

UVA-1368 DNA Consensus String(思路)的更多相关文章

  1. uva 1368 DNA Consensus String

    这道题挺简单的,刚开始理解错误,以为是从已有的字符串里面求最短的距离,后面才发现是求一个到所有字符串最小距离的字符串,因为这样的字符串可能有多个,所以最后取最小字典序的字符串. 我的思路就是求每一列每 ...

  2. 【每日一题】UVA - 1368 DNA Consensus String 字符串+贪心+阅读题

    https://cn.vjudge.net/problem/UVA-1368 二维的hamming距离算法: For binary strings a and b the Hamming distan ...

  3. UVa 3602 - DNA Consensus String 水题 难度: 0

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  4. 贪心水题。UVA 11636 Hello World,LA 3602 DNA Consensus String,UVA 10970 Big Chocolate,UVA 10340 All in All,UVA 11039 Building Designing

    UVA 11636 Hello World 二的幂答案就是二进制长度减1,不是二的幂答案就是是二进制长度. #include<cstdio> int main() { ; ){ ; ) r ...

  5. uva1368 DNA Consensus String

    <tex2html_verbatim_mark> Figure 1. DNA (Deoxyribonucleic Acid) is the molecule which contains ...

  6. DNA Consensus String

    题目(中英对照): DNA (Deoxyribonucleic Acid) is the molecule which contains the genetic instructions. It co ...

  7. 紫书第三章训练1 E - DNA Consensus String

    DNA (Deoxyribonucleic Acid) is the molecule which contains the genetic instructions. It consists of ...

  8. 【习题 3-7 UVA - 1368 】DNA Consensus String

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举每一位字母是什么. 从小到大枚举. 然后计算每一位的总贡献是多少. 取最小的那个输出. [代码] #include <bi ...

  9. DNA Consensus String UVA - 1368

    题目链接:https://vjudge.net/problem/UVA-1368 题意:给出一组字符串,求出一组串,使与其他不同的点的和最小 题解:这个题就是一个点一个点求,利用桶排序,求出最多点数目 ...

随机推荐

  1. bzoj4195 [Noi2015]程序自动分析——并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4195 突然在这道大水题上WA了半天... 思路很简单,离线处理询问,先把 = 的都加到并查集 ...

  2. 1998 NOIP 拼数 string 和sort的新理解

    题目:https://www.luogu.org/problemnew/show/P1012 今天真是长了见识.这道题做了十几分钟,用模拟愣是调不出来.直到我看了题解——(当场去世)…… 题的意思是n ...

  3. Linux中的LVM

    逻辑卷管理器,通过将另外一个硬盘上的分区加到已有文件系统,来动态地向已有文件系统添加空间的方法. 逻辑卷管理的核心是处理安装在系统上的硬盘分区.在逻辑卷管理的世界里,硬盘称作物理卷(Physical ...

  4. Python基础 — OS

    OS模块 -- 简介   OS模块是Python标准库中的一个用于访问操作系统功能的模块,OS模块提供了一种可移植的方法使用操作系统的功能.使用OS模块中提供的接口,可以实现跨平台访问.但是在OS模块 ...

  5. bzoj 1620: [Usaco2008 Nov]Time Management 时间管理【贪心】

    按s从大到小排序,逆推时间模拟工作 #include<iostream> #include<cstdio> #include<algorithm> using na ...

  6. 生成自签名ca 证书 使nginx 支持https

    创建服务器私钥,命令会让你输入一个口令:$ openssl genrsa -des3 -out server.key 1024创建签名请求的证书(CSR):$ openssl req -new -ke ...

  7. fread/fwrite实现复制功能

    1.  fread/fwrite实现复制功能 #include <stdio.h> #include <stdlib.h> #define BUFFSIZE 4096 //执行 ...

  8. CF869C The Intriguing Obsession

    思路: 分别在两种不同颜色的岛屿群之间进行搭桥.因为相同颜色的岛屿之间不能有边,任意两个相同颜色的岛屿不能同时和另外一个不同颜色的岛屿都有边.实现: #include <bits/stdc++. ...

  9. 浅谈css的行内类型标签和块级标签

    常用标签的行内类型标签有:a.span.img:块级标签有:div.p.h1~6.ul.ol.li.dl.dt.dd. 行内类型标签的特征:标签的大小由标签的内容决定,不能设置width和height ...

  10. 树莓派+百度api实现人脸识别

    title: 树莓派+百度api实现人脸识别 tags: 树莓派 date: 2018-5-31 20:06:00 --- 树莓派对接百度api 我以前玩安卓的时候一直用的讯飞的平台和api,对于百度 ...