模拟算法题练习(二)(DNA序列修正、无尽的石头)

 (一、DNA序列修正)

问题描述
在生物学中,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,(1 ≤ N ≤ 103),表示 DNA 序列的长度。
接下来的两行,每行包含一个长度为 N 的字符串,表示两条 DNA序列。
输出格式
输出一个整数,表示让第二条 DNA 序列和第一条 DNA 序列互补所需的最小操作次数。

2 2 0 0 3 -1 0 1

样例输出:

2 1

解法一:

问题分析

给定两条 DNA 序列,我们需要将第二条 DNA 序列修改为与第一条 DNA 序列互补。碱基互补规则是 A 与 T 互补,C 与 G 互补。同时,任何一个位置只能操作一次。

方法实现

我们可以考虑贪心的思路,因为每次修改操作只能修正一个位置,就是操作和得分比是 1:1;如果我们考虑通过交换来同时修正两个位置,那么操作和得分比就是 1:2,我们应当尽可能多地使用该操作。那么整个过程就是:

  1. 从左到右扫描第一条 DNA 序列和第二条 DNA 序列的每一个位置,检查它们是否互补。

  2. 如果某个位置不互补,我们需要寻找第二条 DNA 序列中后续位置的碱基,看是否可以通过交换使这两个位置都互补。如果可以,我们就进行交换。

  3. 如果在后续位置找不到可以交换的碱基,说明这个位置只能通过替换来满足要求。因为每个位置只能修改一次,所以我们不能把不配对的碱基交换到当前位置作为中转站,则只能进行修改。

  4. 每次交换或替换,操作计数器增加 1。

  5. 最后输出操作计数器的值。

时间复杂度和空间复杂度分析

时间复杂度:O(N2)。在最坏情况下,我们可能需要为每个位置在之后的所有位置中查找可以交换的碱基。

空间复杂度:O(N)。主要是由于输入的两个字符串。

#define  _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std; // 使用std命名空间,以便直接使用cout、cin等,而不是std::cout、std::cin// 映射表,将字符映射到对应的整数值,A->0, C->1, G->2, T->3
map<char, int>mp{{'A',0},{'C',1},{'G',2},{'T',3}
};int main()
{int n;cin >> n;string a, b;cin >> a >> b;int cnt = 0; for (int i = 0; i < n; ++i){if (mp[a[i]] + mp[b[i]] != 3){// 从当前位置之后开始遍历 b 字符串for (int j = i + 1; j < n; ++j){// 如果交换后可以使得两个字符组合为 "AT" 或者 "CG"if (mp[a[i]] + mp[b[j]] == 3 && mp[a[j]] + mp[b[i]] == 3){swap(b[i], b[j]);break;}}cnt++;}}cout << cnt << endl;return 0;
}

解法二:

#include <bits/stdc++.h>//需要注意的是:每个位置上的碱基只能被操作一次
// 对于操作二, 一定能一次让一个位置变正确
// 对于操作一, 有可能是两/一/零个位置变正确// 尽量使用操作一, 使两个位置同时变正确void solve(const int &Case) {int n;std::cin >> n;std::string s1, s2;std::cin >> s1 >> s2;// A-T C-Gfor (int i = 0; i < n; i++) { // 把序列一转成互补的序列if (s1[i] == 'A')s1[i] = 'T';else if (s1[i] == 'T')s1[i] = 'A';else if (s1[i] == 'C')s1[i] = 'G';else s1[i] = 'C';}int ans = 0;for (int i = 0; i < n; i++) { if (s1[i] == s2[i])continue; // 如果当前位置已经正确, 则不需要动for (int j = 0; j < n; j++) {if (s1[i] == s2[j] && s1[j] == s2[i]) { // 如果一次操作能正确两个位置std::swap(s1[i], s1[j]);// 交换, 执行操作一break;}}ans++;}std::cout << ans << '\n';
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int T = 1;for (int i = 1; i <= T; i++)solve(i);return 0;
}

(二、无尽的石头)

用户登录

问题描述
在一个古老的迷宫中,有一道无尽的通道。通道上每隔一定的距离就会有一块神秘的石头,石头上刻着从1开始的连续整数。从1号石头开始,每块石头的编号都比前一块大 1。
石头上的数字有特殊的意义。如果你站在编号为 几的石头上,并向前走,你将会瞬间移动到编号为几十的石头上,其中为几的各位数字之和。
例如,如果你站在编号为 16 的石头上,由于1+6-7,所以下一步你会移动到编号为 16 +7= 23 的石头上。
现在,会有多次询问,你需要对每个询问输出从1号石头出发,到达指定编号石头的最少步数,如果无法到达,则输出-1。
输入格式
输入包含一个整数 t,(1 <t< 100),表示有t个询问。接下来t行,每行一个整数 n,(1 ≤ n  ≤ 1e6),表示目标石头的编号。
输出格式
对于每个询问,输出一行,表示从1号石头到达目标石头的最少步数。如果无法到达,输出 -1。

解法一:

此题的解决方案可以进行数学化和形式化的优化。首先,题目所述的情况可以被看做是一个单向图的遍历问题,其中节点由数字标号的石头组成,初始节点为标号为 1 的石头。在此图中,从当前节点 n 移动到下一个节点 n+x 的路径是唯一的,其中 x 是 n 的各位数字之和。

鉴于每次遍历只存在一个可能的路径,求解最短路径的问题实际上变成了确定目标节点是否能够在此唯一路径上被访问到。只需依次模拟每一步遍历过程,如果能够在某一步到达目标节点,那么这一步就是到达目标节点的最短路径长度。但是,如果在某一步遍历时跳过了目标节点,那么目标节点将无法访问,因为无法向较小的节点移动。

对于多次查询,我们可以预处理一段范围内的所有可能访问到的节点,并将这些节点存储在数组中。在这种情况下,数组的索引即为到达该节点所需的步数。每当一个新的查询到来,只需检查目标数字是否存在于数组中。如果存在,数组中的索引就是到达目标的最短步数;否则,目标节点将无法被访问。

#include<bits/stdc++.h>using namespace std;
#define ll long longconst ll MAX = 1e6;// 设置最大值为1000000
vector<ll> stones;ll sum_digits(ll n) {// 求各个数位数字之和ll sum = 0;while (n) {sum += n % 10;n /= 10;}return sum;
}void preprocess() {stones.push_back(1);// 向vector中添加数字1作为起始点  while (true) {ll next = *--stones.end() + sum_digits(*--stones.end());// 计算容器 stones 中倒数第二个元素的值,然后将该值与计算该元素各个数字的和相加,并将结果赋值给变量 nextif (next <= MAX) {stones.push_back(next);}else {break;}}
}int main() {preprocess(); // 预处理函数,生成 stones 数组int t;cin >> t;while (t--) {int n;cin >> n;// 在vector中查找石头编号n,如果找到,输出其在vector中的位置(从0开始计数)auto it = find(stones.begin(), stones.end(), n);if (it != stones.end()) {cout << it - stones.begin() << endl;// 输出位置}else {cout << -1 << endl;}}return 0;
}

解法二:

#include <bits/stdc++.h>/*
考虑 ai 表示从 1 走到 i 的步数,若走不到则是 ?1。一个明显的递推
方式便是,若 ai = 1,则 ai+f(i) = ai + 1,其中 f(i) 表示 i 的十进制数
位和。预处理除 a 即可询问 O(1) 回答。
时间复杂度 O(n + T)。
*/std::vector<int> a(1'000'000 + 1, -1);//1 2 4 8 ......void solve(const int &Case) {int n;std::cin >> n;std::cout << a[n] << '\n';
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);// 156423// 1 + 5 + 6 + 4 + 2 + 3// 3// 156432 / 10 = 15642// 15642 / 10 = 1564// ...auto f = [&](int x) { //求 x 的各个数位和的函数int ret = 0;while (x > 0) {ret += x % 10;// 取出当前的个位数x /= 10; //}return ret;};// i -> i + f(i)a[1] = 0;for (int i = 1; i <= 1'000'000; i++) {if (a[i] == -1)continue;int x = i + f(i);if (x > 1'000'000)break; // > 1'000'000 的位置一定是不会询问的a[x] = a[i] + 1; // a[i + f(i)] = a[i] + 1}int T = 1;std::cin >> T;for (int i = 1; i <= T; i++)solve(i);return 0;
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/711515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu基础操作(1)-个人笔记

搜狗输入法Linux官网-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://pinyin.sogou.com/linux 1.关闭sudo密码&#xff1a; 终端&#xff08;ctrl alt t&#xff09;输入 sudo visudo 打开visudo 找到 %sudo ALL(ALL:ALL) ALL 这一行…

羊大师分享,羊奶奶有哪些对健康有益的喝法?

羊大师分享&#xff0c;羊奶奶有哪些对健康有益的喝法&#xff1f; 羊奶奶有多种对健康有益的喝法&#xff0c;以下是一些建议&#xff1a; 直接饮用&#xff1a;将羊奶直接煮沸后饮用&#xff0c;可以保留羊奶中的营养成分&#xff0c;为身体提供全面的滋养。羊奶的丰富蛋白质…

代码随想录算法训练营第二十八天补|93.复原IP地址 ● 78.子集 ● 90.子集II

组合问题&#xff1a;集合内元素的组合&#xff0c;不同集合内元素的组合 分割问题&#xff1a;本质还是组合问题&#xff0c;注意一下如何分割字符串 回溯模板伪代码 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xf…

【六袆 - MySQL】MySQL 5.5及更高版本中,InnoDB是新表的默认存储引擎;

InnoDB 这是一个MySQL组件&#xff0c;结合了高性能和事务处理能力&#xff0c;以确保可靠性、健壮性和并发访问。它体现了ACID设计哲学。它作为一个存储引擎存在&#xff0c;处理使用ENGINEINNODB子句创建的或修改的表。请参阅第14章“InnoDB存储引擎”以获取有关架构细节和管…

【解决】虚幻导入FBX模型不是一个整体

问题&#xff1a; 现在有一个汽车的fbx模型&#xff0c;导入虚幻引擎&#xff0c;导入后变成了很多汽车零件模型。 解决&#xff1a; 把“合并网格体”勾选上&#xff0c;解决问题。

Unity 佳能SDK 及数据获取

1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你 佳能(中国)- 佳定制(佳能影像产品),SDK,EDSDK,CCAPI,软件开发包下载 2. 将SDK这两个文件放到 Unity Plugins文件夹 3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中

ElasticSearch搜索引擎使用指南

一、ES数据基础类型 1、数据类型 字符串 主要包括: text和keyword两种类型&#xff0c;keyword代表精确值不会参与分词&#xff0c;text类型的字符串会参与分词处理 数值 包括: long, integer, short, byte, double, float 布尔值 boolean 时间 date 数组 数组类型不…

基于ssm学生公寓管理系统的设计与开发论文

学生公寓管理系统的设计与实现 摘要 如今&#xff0c;科学技术的力量越来越强大&#xff0c;通过结合较为成熟的计算机技术&#xff0c;促进了学校、医疗、商城等许多行业领域的发展。为了顺应时代的变化&#xff0c;各行业结合互联网、人工智能等技术&#xff0c;纷纷开展了…

P1160 队列安排题解

题目 一个学校里老师要将班上N个同学排成一列&#xff0c;同学被编号为1∼N&#xff0c;他采取如下的方法&#xff1a; 先将1号同学安排进队列&#xff0c;这时队列中只有他一个人&#xff1b; 2∼N号同学依次入列&#xff0c;编号为i的同学入列方式为&#xff1a;老师指定编…

下载huggingface数据集到本地并读取.arrow文件遇到的问题

文章目录 1. 524MB中文维基百科语料&#xff08;需要下载的数据集&#xff09;2. 下载 hugging face 网站上的数据集3. 读取 .arrow 文件报错代码4. 纠正后代码 1. 524MB中文维基百科语料&#xff08;需要下载的数据集&#xff09; 2. 下载 hugging face 网站上的数据集 要将H…

MATLAB环境下一种新颖的类脉冲信号的高分辨率时频分析方法

一般情况下&#xff0c;机械振动信号或地震信号是非平稳的。而传统傅立叶变换只能应用于平稳信号分析&#xff0c;故不适用于非平稳信号。所以&#xff0c;我们需要采用时频分析方法。时频分析方法能达到同时在时间域和频率域对信号进行分析的目的&#xff0c;得到信号在不同时…

Python爬取网站视频资源

思路&#xff1a; 在界面找到视频对应的html元素位置&#xff0c;观察发现视频的url为https://www.pearvideo.com/video_视频的id&#xff0c;而这个id在html中的href中&#xff0c;所以第一步需要通过xpath捕获到所需要的id 在https://www.pearvideo.com/video_id的页面&…

线程池学习

github看到一个项目&#xff08;GitHub - markparticle/WebServer: C Linux WebServer服务器&#xff09;&#xff0c;内部使用的一个线程池看着不错&#xff0c;拿来学习一下。 /** Author : mark* Date : 2020-06-15* copyleft Apache 2.0*/ #ifndef THREADPO…

Windows系统搭建VisualSVN并结合内网穿透实现远程访问本地服务

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

Spring 事务常见错误(上)

通过上一章的学习&#xff0c;我们了解了 Spring Data 操作数据库的一些常见问题。这一章我们聊一聊数据库操作中的一个非常重要的话题——事务管理。 Spring 事务管理包含两种配置方式&#xff0c;第一种是使用 XML 进行模糊匹配&#xff0c;绑定事务管理&#xff1b;第二种是…

洗澡、泡脚真的能养生? 皮肤科医生来科普

现如今人们越来越注重健康与养生&#xff0c;除了枸杞、生姜等食补外&#xff0c;各种保健方法和保健产品也层出不穷&#xff0c;还有泡脚、洗凉水澡等养生延缓衰老的方式也广泛流行&#xff0c;那么泡脚与洗凉水澡真的有用吗?西安国际医学中心医院皮肤科主任高鹏程特意进行了…

Timeplus-proton流处理器调研

概念 Timeplus是一个流处理器。它提供强大的端到端功能&#xff0c;利用开源流引擎Proton来帮助数据团队快速直观地处理流数据和历史数据&#xff0c;可供各种规模和行业的组织使用。它使数据工程师和平台工程师能够使用 SQL 释放流数据价值。 Timeplus 控制台可以轻松连接到不…

女性三八节礼物攻略:她无法抗拒的五大礼物

随着春风的温柔拂面&#xff0c;我们即将迎来一年一度的三八国际妇女节。这个特别的日子&#xff0c;不仅是对女性贡献的认可和庆祝&#xff0c;也是向我们生命中的女性表达感激和爱意的绝佳时机。在这个充满温馨和敬意的时刻&#xff0c;我们常常在思考&#xff0c;如何用一份…

elementUI el-table中的对齐问题

用elementUI时&#xff0c;遇到了一个无法对齐的问题&#xff1a;代码如下&#xff1a; <el-table :data"form.dataList" <el-table-column label"验收结论" prop"checkResult" width"200"> <template slot-sco…

揭秘!Excel如何成为职场中的价值创造利器

文章目录 一、Excel在生产力提升中的作用二、Excel在创造价值方面的应用案例三、Excel实用技巧分享四、Excel与其他工具的协同应用五、Excel学习的建议与展望《Excel函数与公式应用大全》亮点内容简介作者简介目录 在当今信息爆炸的时代&#xff0c;数据处理和分析能力已成为职…