学习C++从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。
附上汇总贴:蓝桥杯备考冲刺必刷题(C++) | 汇总-CSDN博客
【题目描述】
在生物学中, DNA序列的相似性常被用来研究物种间的亲缘关系。现在我们有两条DNA序列, 每条序列由A、C、G、T四种字符组成, 长度相同。但是现在我们记录的DNA序列存在错误, 为了严格满足DNA序列的碱基互补配对即A-T和C-G,我们需要依据第一条DNA序列对第二条DNA序列进行以下操作:
1.选择第二条DNA序列的任意两个位置, 交换他们的字符。
2.选择第二条DNA序列任意一个位置, 将其字符替换为A、C、G、T中的任何一个。
需要注意的是:每个位置上的碱基只能被操作一次!
你的任务是通过最小的操作次数, 使第二条DNA序列和第一条DNA序列互补。并且已知初始两条DNA序列长度均为
N
N
N。
【输入】
第一行包含一个整数
N
N
N,
(
1
≤
N
≤
1
0
3
)
(1\le N\le 10^3)
(1≤N≤103),表示DNA序列的长度。
接下来的两行, 每行包含一个长度为
N
N
N的字符串, 表示两条DNA序列。
【输出】
输出一个整数, 表示让第二条DNA序列和第一条DNA序列互补所需的最小操作次数。
【输入样例】
5
ACGTG
ACGTC
【输出样例】
2
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, ans;
string a, b;
int mp[6];
int main()
{
cin >> n;
cin >> a >> b;
mp['A'] = 0, mp['T'] = 3, mp['C'] = 1, mp['G'] = 2; // 预先定义A-T,C-G配对
for (int i=0; i<n; i++) { // 遍历n个字符
if (mp[a[i]] + mp[b[i]]!=3) { // 如果不是配对的
for (int j=i+1; j<n; j++) { // 就往后找能否配对的
if (mp[a[i]]+mp[b[j]]==3 && mp[a[j]]+mp[b[i]]==3) {
swap(b[i], b[j]); // 找到后进行交换
break;
}
}
ans++; // 不论是否找到配对后交换,还是单一字符替换,操作次数都自增1
}
}
cout << ans << endl; // 输出操作次数
return 0;
}
【运行结果】
5
ACGTG
ACGTC
2