【GESP】C++三级练习 luogu-B2111 基因相关性
GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★✮☆☆☆。
luogu-B2111 基因相关性
题目要求
题目描述
为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的 DNA 进行比对,以判断该比对的 DNA 是否具有相关性。
现比对两条长度相同的 DNA 序列。首先定义两条 DNA 序列相同位置的碱基为一个碱基对,如果一个碱基对中的两个碱基相同的话,则称为相同碱基对。接着计算相同碱基对占总碱基对数量的比例,如果该比例大于等于给定阈值时则判定该两条 DNA 序列是相关的,否则不相关。
输入格式
有三行,第一行是用来判定出两条 DNA 序列是否相关的阈值,随后 $2$ 行是两条 DNA 序列(长度不大于 $500$)。
输出格式
若两条 DNA 序列相关,则输出
yes
,否则输出no
。
输入输出样例 #1
输入 #1
1
2
3
0.85
ATCGCCGTAAGTAACGGTTTTAAATAGGCC
ATCGCCGGAAGTAACGGTCTTAAATAGGCC
输出 #1
1
yes
题目分析
解题思路
题目要求比较两条DNA序列的相关性,通过计算相同碱基对的比例与给定阈值比较来判断。
- 解题关键点:
- 需要统计两条DNA序列中相同位置相同碱基的数量
- 计算相同碱基对占总碱基对的比例
- 将比例与给定阈值进行比较
- 具体思路:
- 输入阈值和两条DNA序列
- 遍历两条序列,统计相同位置相同碱基的数量
- 计算相同碱基对的比例(相同碱基对数量/总碱基对数量)
- 将计算出的比例与阈值比较,大于等于阈值输出”yes”,否则输出”no”
- 时间复杂度分析:
- 只需要遍历一次DNA序列,时间复杂度为O(n),其中n为序列长度
- 空间复杂度为O(1),只需要存储几个变量
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <string>
int main() {
// 定义阈值变量
double level;
// 定义两个DNA序列字符串
std::string str_1, str_2;
// 输入阈值和两个DNA序列
std::cin >> level >> str_1 >> str_2;
// 记录相同碱基对的数量
int same_count = 0;
// 遍历DNA序列,统计相同碱基对
for (int i = 0; i < str_1.size(); i++) {
if (str_1[i] == str_2[i]) {
same_count++;
}
}
// 计算相同碱基对的比例,与阈值比较并输出结果
if ((double)same_count / str_1.size() >= level) {
std::cout << "yes";
} else {
std::cout << "no";
}
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权