题目:

链接

题意:

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

给出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
*/

最新文章

  1. 一步一步将Vim打造成C++超级IDE
  2. java基础3_流程控制语句
  3. mfc/格式转换
  4. /etc/passwd /etc/shadow
  5. Linux下的paste合并命令详解
  6. ubuntu/linux mint 创建proc文件的三种方法(两)
  7. 优化viewHolder
  8. php使用ZipArchive压缩文件的心得
  9. K:java中序列化的两种方式—Serializable或Externalizable
  10. 第十一篇:Map/Reduce 工作机制分析 - 错误处理机制
  11. 王家林人工智能AI课程大纲和电子书 - 老师微信13928463918
  12. 【c#】RabbitMQ学习文档(二)Work Queues(工作队列)
  13. flask狗书
  14. Laravel中resource方法
  15. hdu1285 确定比赛名次【拓扑排序】
  16. apache mod_python 安装
  17. Spring boot jackson
  18. 10、Dockerfile实战-PHP
  19. 联想笔记本thinkpad按F2不能直接重命名
  20. 方程式0day图形化利用工具

热门文章

  1. Robot Framework快捷键图标制作 去掉cmd命令窗口
  2. Silverlight调用WCF(1)
  3. [译]NUnit--Installation(三)
  4. 蓝书3.3 SPFA算法的优化
  5. POJ1389 Area of Simple Polygons 线段树
  6. 洛谷P1297 单选错位——期望
  7. ubuntu 14.04中: 像ubuntu16.04 一样可以在文件夹内打开此路径下的shell
  8. bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】
  9. 清北考前刷题day1早安
  10. Akka源码分析-Akka-Streams-Materializer(1)