逐位比较两条等长 DNA 序列统计相同碱基对个数,比例大于等于阈值即相关;一次线性扫描 O(n)。
OJ: roj
题目 ID: 1131
难度:入门
标签:字符串模拟
创建: 2026-09-29 20:15
更新: 2026-10-05 02:53
题目描述
比对两条长度相同(长度不大于 yes,否则输出 no。样例输入 0.85 / ATCGCCGTAAGTAACGGTTTTAAATAGGCC / ATCGCCGGAAGTAACGGTCTTAAATAGGCC,输出 yes。
思路
逐位比较两条序列,统计相同碱基对的个数
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 20:15
# update_at: 2026-10-04 09:35
import sys
def solve() -> None:
# 阈值在输入最前,随后依次是两条等长 DNA 序列
data = iter(sys.stdin.buffer.read().split())
threshold = float(next(data))
seq1, seq2 = next(data), next(data)
length = len(seq1)
same = sum(a == b for a, b in zip(seq1, seq2)) # 相同碱基对的个数
print("yes" if same / length >= threshold else "no")
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-09-29 20:15
* update_at: 2026-10-05 02:53
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 505;
char seq1[maxn]; // 第一条 DNA 序列
char seq2[maxn]; // 第二条 DNA 序列
double threshold; // 判定相关的阈值
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> threshold >> seq1 >> seq2;
ll length = strlen(seq1);
ll same = 0; // 相同碱基对的个数
for (ll i = 0; i < length; i++) {
if (seq1[i] == seq2[i]) {
same++;
}
}
// 相同碱基对比例与阈值比较,注意含等号
double ratio = 1.0 * same / length;
if (ratio >= threshold) {
cout << "yes" << "\n";
} else {
cout << "no" << "\n";
}
return 0;
}