蓝桥杯备考冲刺必刷题(C++) | 3904 DNA序列修正

学习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) (1N103),表示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
  • 31
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值