模拟
1.模拟算法介绍
模拟算法通过模拟实际情况来解决问题,一般容易理解但是实现起来比较复杂,有很多需要注意的细节,或者是一些所谓很”麻烦”的东西。
模拟题一般不涉及太难的算法,一般就是由较多的简单但是不好处理的部分组成的,考察选手的细心程度和整体的逻辑思维。
一般为了使得模拟题写的逻辑清晰一些,经常会写比较多的小函数来帮助解题,例如int和string的相互转换、回文串的判断、日期的转换、各种特殊条件的判断等等。
2.例题
2.1 地址转换
题目描述
Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为"IU5"。
事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。第12行第4列表示为"R12C4",第5行第255列表示为"R5C255""。你的任务是:编写程序,实现从RC地址格式到常规地址格式的转换。
输入描述
用户先输入一个整数 n ( n < 100 ) n (n <100) n(n<100),表示接下来有 n n n行输入数据。
接着输入的n行数据是RC格式的Excel单元格地址表示法。
输出描述
程序则输出 n n n行数据,每行是转换后的常规地址表示法。
输入输出样例
示例
输入
2
R12C4
R5C255
输出
D12
IU5
思路
这个题本质就是进制的转化,Excel表中的列可以转换为26进制。
代码
#include <bits/stdc++.h>
using namespace std;
int n, r, c;
char a, b;
int main() {
cin >> n;
while(n --) {
cin >> a >> r >> b >> c;
if(b <= 26) {
char d = c + 'A' - 1;
cout << d << r << endl;
} else if(b > 26) {
char d = 'A' + c/26 - 1;
char e = 'A' + c%26 - 1;
cout << d << e << c << endl;
}
}
return 0;
}
2.2 DNA序列修正
问题链接:https://www.lanqiao.cn/problems/3904/learning/page=1&first_category_id=1&name=DNA
问题描述
在生物学中, D N A DNA DNA序列的相似性常被用来研究物种间的亲缘关系。现在我们有两条 D N A DNA DNA序列,每条序列由 A 、 C 、 G 、 T A、C、G、T A、C、G、T四种字符组成,长度相同。但是现在我们记录的 D N A DNA DNA序列存在错误,为了严格满足 D N A DNA DNA序列的碱基互补配对即 A − T A-T A−T和 C − G C-G C−G,我们需要依据第—条 D N A DNA DNA序列对第二条 D N A DNA DNA序列进行以下操作:
1.选择第二条 D N A DNA DNA序列的任意两个位置,交换他们的字符。
2.选择第二条 D N A DNA DNA序列任意一个位置,将其字符替换为 A 、 C 、 G 、 T A、C、G、T A、C、G、T中的任何一个。
需要注意的是:每个位置上的碱基只能被操作一次!
你的任务是通过最小的操作次数,使第二条 D N A DNA DNA序列和第一条 D N A DNA DNA序列互补。并且已知初始两条 D N A DNA DNA序列长度均为 N N N。
输入格式
第一行包含一个整数 N N N, ( 1 < N < 1 0 3 ) (1 <N<10^3) (1<N<103),表示 D N A DNA DNA序列的长度。
接下来的两行,每行包含一个长度为 N N N的字符串,表示两条 D N A DNA DNA序列。
输出格式
输出一个整数,表示让第二条DNA序列和第—条DNA序列互补所需的最小操作次数。
样例输入
5
ACGTG
ACGTC
样例输出