【题目】

输入m组n长的DNA序列,要求找出和其他Hamming距离最小的那个序列,求其与其他的Hamming距离总和。

如果有多个序列,求字典序最小的。

【注】这道题是我理解错误,不是找出输入的序列中和其他距离最小的,而是找到一个DNA序列到所有其他的序列距离最小。

正确方法是统计每一位的AGCT出现频次,然后找到每一位出现最多的。

因为只有AGCT,所以可以用一个dict char dict = "AGCT"这样的套路存储。

【知识点】

  1. 字典序比较:strcmp
#include <string.h>
strcmp(str1, str2)

结果:

0 str1 = str2

负数 str1 < str2

正数 str1 > str2

判断是否满足str1 > str2 的条件:

if(strcmp(str1, str2))

【代码】

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
const int max_m = 55;
const int max_n = 1005; void show_matrix(char a[][max_n], int m, int n)
{
for (int i = 0; i < m; i++)
{
printf("%s\n", a[i]);
}
} void show_matrix_digit(int a[][max_n], int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
} int compare_hamming_distance(char a[][max_n], int x, int y, int n)
{
int tot = 0;
for (int i = 0; i < n; i++)
{
if (a[x][i]!=a[y][i])
{
tot++;
}
}
return tot;
} int count_sum_line(int a[][max_n], int m, int x) //一共m组,计算第x行
{
int sum = 0;
for (int i = 0; i < m; i++)
{
sum = sum + a[x][i];
}
return sum;
} int get_min(int a[], int m) //找出数组中的最小值
{
int min = 0x3F3F3F3F;
for (int i = 0; i < m; i++)
{
if (a[i] <= min)
{
min = a[i];
}
}
return min;
} void get_loc(int a[], int m, int min, int b[]) //用一个全0数组b作为标记,如果某位为最小值,将这位置为1. m:数组长度
{
for (int i = 0; i < m; i++)
{
if (a[i] == min)
{
b[i] = 1;
}
}
} int main()
{
char a[max_m][max_n]; //创建二维数组a用于存储
int distance[max_m][max_n]; //建立距离矩阵,用于存储m组数据之间的Hamming距离
int m, n;
//输入二维的长,宽
scanf("%d%d", &m, &n);
fflush(stdin);
//输入m组n长的序列
for (int i = 0; i < m; i++)
{
scanf("%s", a[i]);
fflush(stdin);
}
printf("This is your input:\n");
show_matrix(a, m, n); //函数测试
//int re = compare_hamming_distance(a, 0, 1, n);
//printf("result %d\n", re); //将Hamming距离写入Hamming Distance矩阵
for (int i = 0; i < m; i++)
{
for (int j = i ; j < m; j++)
{
distance[i][j] = compare_hamming_distance(a, i, j, n);
distance[j][i] = compare_hamming_distance(a, i, j, n);
}
}
show_matrix_digit(distance, m, m); //建立一个b数组,存储m组数据分别和其他组数据的距离
int b[max_m];
memset(b, 0, sizeof(b));
for (int i = 0; i < m; i++)
{
b[i] = count_sum_line(distance, m, i);
}
int min = get_min(b, m); //找到最小值
//找到有多少个最小值 //找到对应的数组,标1
int c[max_m];
memset(c, 0, sizeof(c));
get_loc(b, m, min, c); //生成字典序最大值
char d[max_n];
for (int i = 0; i < n; i++)
{
d[i] = 'Z';
} for (int i = 0; i < m; i++)
{
if(c[i])
{
if(strcmp(d,a[i])) //字典序比较
{
for (int j = 0; j < n; j++)
{
d[j] = a[i][j];
}
}
}
} printf("minimum hamming distance to other,the total distance is %d\n", min);
printf("%s",d);
}

【C/C++】习题3-7 DNA/算法竞赛入门经典/数组与字符串的更多相关文章

  1. 【C/C++】习题3-4 周期串/算法竞赛入门经典/数组和字符串

    [题目] 如果某个字符串可以由长度为k的字符串重复多次得到,则称该串以k为周期. 输入一个长度不超过80的字符串,输出最小周期. [思路] 暴力求解.依次考察周期1~长度n. 筛选:周期一定是长度n的 ...

  2. 【C/C++】习题3-3 数数字/算法竞赛入门经典/数组和字符串

    [题目] 把前n个(n<=10000)的整数顺序写在一起:123456789101112-- 数一数0~9各出现多少次(输出10个整数,分别是0,1,2,--,9出现的次数) [解答] 暴力求解 ...

  3. 【C/C++】习题3-5 谜题/算法竞赛入门经典/数组和字符串

    [题目] 有一个5*5的网络,恰好有一个格子是空的(空格),其他格子各有一个字母. 指令:A, B, L, R 把空格上.下.左.右的相邻字母移到空格中. [输入] 初始网格和指令序列(以数字0结束) ...

  4. 【C/C++】例题3-6 环状序列/算法竞赛入门经典/数组和字符串

    [字典序比较] 对于两个字符串,比较字典序,从第一个开始,如果有两位不一样的出现,那么哪个的ASCII码小,就是字典序较小.如果都一样,那么短的小. [题目] 输入一个环状串,输出最小的字典序序列. ...

  5. 【C/C++】例题3-5 生成元/算法竞赛入门经典/数组与字符串

    [题目] x+x的各位数之和为y,x为y的生成元. 求10万以内的n的最小生成元,无解输出0. [解答] 这是我根据自己的想法最初写的代码: #include<cstdio> #inclu ...

  6. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  7. [刷题]算法竞赛入门经典 3-7/UVa1368 3-8/UVa202 3-9/UVa10340

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 都是<算法竞赛入门经典(第二版)>的题目,标题上没写(第二版) 题目:算法竞赛入门经典 3-7/UVa13 ...

  8. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  9. [刷题]算法竞赛入门经典 3-12/UVa11809

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...

随机推荐

  1. adduser vs useradd

    Always use adduser (and deluser when deleting users) when you're creating new users from the command ...

  2. MarkdownPad2 注册码

    邮箱: Soar360@live.com 授权秘钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2M5SN6b ...

  3. vue如何写组件(script标签引入的方式)

    很多人知道.vue结构的单文件组件形式,不过这种单文件组件的结构如果要加入到现有的jquery项目中就比较麻烦了,那如果我们又想用vue来写模板,又不想引入vue-cli管理,那该怎么来写组件呢?别着 ...

  4. 菜鸡的Java笔记 第二十二 - java 对象多态性

    本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的,        而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...

  5. 1-Introduction(介绍)

    目录: 正文: (一)機器學習就是让机器自動找函式 语音/图像识别 (二)你想找什麼樣的函式? (2.1)Regression 找出的函数其输出是一个数值 (2.2)Classification (2 ...

  6. [atAGC054E]ZigZag Break

    结论:(不妨假设$p_{1}<p_{n}$)$\{p_{i}\}$合法当且仅当$\exists 1\le i\le n-1$,使得$p_{1}\ge p_{i}$且$p_{i+1}\ge p_{ ...

  7. [hdu5379]Mahjong tree

    一棵子树的每一个儿子相当于划分一个区间,同时这些区间一定要存在一个点连续(直接的儿子),因此每一棵树最多只有两个儿子存在子树,并且这两个儿子所分到的区间一定是该区间最左和最右两段,所以ans*=(so ...

  8. MySQL 在线开启&关闭GTID模式

    MySQL 在线开启&关闭GTID模式 目录 MySQL 在线开启&关闭GTID模式 基本概述 在线开启GTID 1. 设置GTID校验ENFORCE_GTID_CONSISTENCY ...

  9. “微信小程序从分享卡片进入,第一次获取不到用户uid、第二次能获取到用户uid”解决方法

    用uniapp开发微信小程序时,有一个需求是分享罐表详情页面给其它用户,其它用户(在已经登录的状态下)点击分享卡片可以直接跳转到该罐表详情页,且能显示自己是否已经收藏该罐表(收藏状态由用户uid和罐表 ...

  10. Atcoder M-SOLUTIONS Programming Contest C - Best-of-(2n-1)(无穷级数求和+组合恒等式)

    Atcoder 题面传送门 & 洛谷题面传送门 无穷级数求和的简单题,稍微写写吧,正好也算帮我回忆下组合数这一块的内容. 首先我们不妨假设 A 赢,B 赢的情况就直接镜像一下即可.我们枚举 B ...