蓝桥模拟题
前言
🎆大家好,我是秋名山路上的漂移者,昨天也是抽空做了一下,蓝桥号称30块的模拟赛,不说了,感受了一下,又是割韭菜的一波骚操作,由于我是没有买的,题目来源于:执 梗,老哥是用Java语言写的,我由于使用c++比赛,就用c++不同的思路写了一波,题目比较简单,我们一起来看一下吧!!!
👍蓝桥推荐文章
本文,老规矩: 采用🍺来表示题目的难度,🍺个数越多说明题目越难
🍺1.A的个数
以下是一个 25 行 25 列的字母矩阵,全部由字母 A 和 B 组成。
AAAAAAABABBAABABABAAAAAAA
ABBBBBABBAABBBBBABABBBBBA
ABAAABABBBABAABBBBABAAABA
ABAAABABBBBBAABAABABAAABA
ABAAABABBABABBABABABAAABA
ABBBBBABBBABAABBBBABBBBBA
AAAAAAABABABABABABAAAAAAA
BBBBBBBBABAABABBBBBBBBBBB
AABAABABBAAABBAAABABBBBBA
ABBABABBBABBAAAABBBBAAAAB
BBBBAAABABAABABAABBBAABBA
BBAABABABAAAABBBAABBAAAAA
ABABBBABAABAABABABABBBBBA
AAAABBBBBABBBBAAABBBABBAB
AABAABAAABAAABAABABABAAAA
ABBBBBBBBABABBBBABAABBABA
ABBBAAABAAABBBAAAAAAABAAB
BBBBBBBBABBAAABAABBBABBAB
AAAAAAABBAAABBBBABABAABBA
ABBBBBABBAABABAAABBBABBAA
ABAAABABABBBAAAAAAAAAABAA
ABAAABABABABBBABBAABBABAA
ABAAABABBABBABABAABAABAAA
ABBBBBABABBBBBABBAAAABAAA
AAAAAAABAABBBAABABABBABBA
请问在这个矩阵中有多少个字母A?
没有难度,直接存储这个字符串,遍历字符串,进行判断,看有多少个A
#include<iostream>
#include<string>
using namespace std;
int main() {
int sum = 0;
string s = "AAAAAAABABBAABABABAAAAAAAABBBBBABBAABBBBBABABBBBBAABAAABABBBABAABBBBABAAABAABAAABABBBBBAABAABABAAABAABAAABABBABABBABABABAAABAABBBBBABBBABAABBBBABBBBBAAAAAAAABABABABABABAAAAAAABBBBBBBBABAABABBBBBBBBBBBAABAABABBAAABBAAABABBBBBAABBABABBBABBAAAABBBBAAAABBBBBAAABABAABABAABBBAABBABBAABABABAAAABBBAABBAAAAAABABBBABAABAABABABABBBBBAAAAABBBBBABBBBAAABBBABBABAABAABAAABAAABAABABABAAAAABBBBBBBBABABBBBABAABBABAABBBAAABAAABBBAAAAAAABAABBBBBBBBBABBAAABAABBBABBABAAAAAAABBAAABBBBABABAABBAABBBBBABBAABABAAABBBABBAAABAAABABABBBAAAAAAAAAABAAABAAABABABABBBABBAABBABAAABAAABABBABBABABAABAABAAAABBBBBABABBBBBABBAAAABAAAAAAAAAABAABBBAABABABBABBA";
for (int i = 0; i <= s.size(); i++) {
if (s[i] == 'A')
sum++;
}
cout << sum;//318
return 0;
}
🍺 2.最2数字
看彦祖们 , 2不2 ? 考试就看我2不2 , 我感觉今天不2 , 也算是签到题吧
如果一个整数的某个数位包含 2 ,则称这个数为一个“最2数字”。例如:102、2021 都是最2数字。
请问在 1(含) 到 2021(含) 中,有多少个最2数字。
//写一个函数判断是否为2
#include<iostream>
#include<string>
using namespace std;
bool check(int n) {
while (n != 0) {
if (n % 10 == 2)
return true;
n /= 10;
}
return false;
}
int main() {
int sum = 0;
for (int i = 1; i <= 2021; i++) {
if (check(i))
sum++;
}
cout << sum;
return 0;
}
🍺🍺3.最少次数
有一个整数 A=2021,每一次,可以将这个数加 1 、减 1 或除以 2,其中除以 2 必须在数是偶数的时候才允许。
例如,2021 经过一次操作可以变成 2020、2022。
再如,2022 经过一次操作可以变成 2021、2023 或 1011。
请问,2021 最少经过多少次操作可以变成 1。
这个题目, 我给俩个🍺,原因是它放到了填空题上,可以使用暴搜来解决,如果是大题的话可能要3个🍺, 原始做法是bfs
//填空题,直接暴力
#include<iostream>
using namespace std;
int main() {
int s = 0;
int n = 2021;
while (n != 1) {
if (n % 10 == 1 || n % 10 == 5 || n % 10 == 9) {
n--;
s++;
}
if (n % 10 == 3 || n % 10 == 7) {
n++;
s++;
}
if (n % 2 == 0) {
n /= 2;
s++;
}
}
cout << s;
return 0;
}
🍺🍺4.超大玉螺旋丸
对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
例如,一个 4 行 5 列的螺旋矩阵如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
请问,一个 30 行 30 列的螺旋矩阵,第 20 行第 20 列的值是多少?
熟悉不 ? 紫书原题,模拟就好
//模拟螺旋矩阵
#include<iostream>
using namespace std;
int a[40][40];
int main() {
int t=0, x=1, y=1;
t = a[x][y] = 1;
while (t < 30 * 30) {
while (y + 1 <= 30 && !a[x][y + 1]) a[x][++y] = ++t;
while (x + 1 <= 30 && !a[x + 1][y]) a[++x][y] = ++t;
while (y - 1 > 0 && !a[x][y - 1]) a[x][--y] = ++t;
while (x - 1 > 0 && !a[x - 1][y]) a[--x][y] = ++t;
}
cout << a[20][20];
return 0;
}
🍺5.二叉树的最大深度
一棵二叉树有2021个结点。该树满足任意结点的左子树结点个数和右子树的结点个数之差最多为1。
定义根结点的深度为0,子结点的深度比父结点深度多1。
请问,树中深度最大的结点的深度最大可能是多少?
这个没有什么好说的 , 学过二叉树就会
10层
推荐一下:码神爆肝数据结构——总长5w字直接去看里面的二叉树就好
🍺大题1 和尚挑水
问题描述
一个和尚要挑水,每次最多能挑 a 千克,水缸最多能装 t 千克,开始时水缸为空。
请问这个和尚最少要挑多少次可以将水缸装满?
输入格式
输入一行包含两个整数 a, t,用一个空格分隔。
输出格式
输出一行包含一个整数,表示答案。
样例输入
20 2021
样例输出
102
评测用例规模与约定
对于所有评测用例,1 <= a <= 100,1 <= t <= 10000。
签到题:
#include<iostream>
#include<string>
using namespace std;
int main() {
int a, t;
cin >> a >> t;
int sum = 0;
for (sum = 0; t > 0; sum++) {
t = t - a;
}
cout << sum;
return 0;
}
🍺大题2 金融数字
问题描述
在金融领域,通常将金额的百位和千位之间、十万位和百万位之间增加逗号(千分位分隔符),以方便阅读。一般从个位开始,每三位之前增加一个逗号。
例如:1234567890.00 通常写成 1,234,567,890.00。
注意小数点后固定保留 2 位。
给定一个包含千分位分隔符的数值,请读入后输出对应的不含千分位的数值,小数点仍然保留 2 位。
输入格式
输入一行包含一个由千分位分隔符的数值,恰好有 2 位小数。
输出格式
输出不含千分位分隔符的数值,保留 2 位小数。
样例输入
1,234,567,890.00
学过sting题目很简单,直接遍历sting,去除其中的,
//加逗号
#include<iostream>
#include<string>
using namespace std;
int main() {
//创建一个新的字符串,直接模拟,碰到不为','的直接加入
string s,s1;
cin >> s;
for (int i = 0; i <= s.size(); i++) {
if (s[i] != ',')
s1 += s[i];
}
cout << s1;
return 0;
}
🍺🍺🍺大题3 插座
问题描述
在金融领域,通常将金额的百位和千位之间、十万位和百万位之间增加逗号(千分位分隔符),以方便阅读。一般从个位开始,每三位之前增加一个逗号。
例如:1234567890.00 通常写成 1,234,567,890.00。
注意小数点后固定保留 2 位。
给定一个包含千分位分隔符的数值,请读入后输出对应的不含千分位的数值,小数点仍然保留 2 位。
输入格式
输入一行包含一个由千分位分隔符的数值,恰好有 2 位小数。
输出格式
输出不含千分位分隔符的数值,保留 2 位小数。
样例输入
1,234,567,890.00
样例输出
1234567890.00
评测用例规模与约定
对于所有评测用例,给定的数值整数部分不超过12位。
#include<iostream>
using namespace std;
char a[105][105], b[105][105];
int n, m, r, c;
bool check(int x, int y) {
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++) {
//同为1或者插头是0继续遍历
if (b[i][j] == '1' && a[x + i][y + j] == '1' || b[i][j] == '0') continue;
else return false;//不符合就说明插不进,出局,继续进行下个查找
}
return true;
}
int main() {
int flag = 0;
//插板
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> a[i];
//插头
cin >> r >> c;
for (int i = 0; i < r; i++)
cin >> b[i];
//假如插板比插座小,那肯定是NO
if (r > n || r > m || c > m || c > n) {
cout << "NO";
return 0;
}
for (int i = 0; i <= n - r; i++)
for (int j = 0; j <= m - c; j++) {
if (check(i, j)) {
cout << i + 1 << " " << j + 1;//因为是从0遍历,所以输出要+1
return 0;
}
}
if (!flag) cout << "NO";
return 0;
}
🍺🍺大题4 公约数
问题描述
给定正整数 a, b, c,请问有多少个正整数,是其中至少两个数的约数。
输入格式
输入一行包含三个正整数 a, b, c。
输出格式
输出一行包含一个整数,表示答案。
样例输入
30 70 35
样例输出
6
样例说明
1、2、5、7、10、35满足条件。
评测用例规模与约定
对于 50% 的评测用例,1 <= a, b, c <= 1000000。
对于所有评测用例,a, b, c 不超过 10**12(10的12次方)。
#include<iostream>
#include<map>//去重操作
using namespace std;
typedef long long LL;
LL a, b, c;
map<LL, bool> M;
LL gcd(LL x, LL y) {
return y == 0 ? x : gcd(y, x%y);
}
int main() {
int s = 0;
cin >> a >> b >> c;
LL g = gcd(a, b);
LL h = sqrt(g);
for (int i = 1; i <= h; i++) {
if (g%i == 0 && !M[i]) {
s++;
M[i] = 1;
}
if (g%i == 0 && g / i > i && !M[g / i]) {
s++;
M[g / i] = 1;
}
}
g = gcd(c, b);
h = sqrt(g);
for (int i = 1; i <= h; i++) {
if (g%i == 0 && !M[i]) {
s++;
M[i] = 1;
}
if (g%i == 0 && g / i > i && !M[g / i]) {
s++;
M[g / i] = 1;
}
}
g = gcd(a, c);
h = sqrt(g);
for (int i = 1; i <= h; i++) {
if (g%i == 0 && !M[i]) {
s++;
M[i] = 1;
}
if (g%i == 0 && g / i > i && !M[g / i]) {
s++;
M[g / i] = 1;
}
}
cout << s;
return 0;
}
🍺🍺🍻 大题4 汉诺塔
问题描述
小蓝很喜欢玩汉诺塔游戏。
游戏中有三根柱子,开始时第一根柱子上有 n 个圆盘,从上到下圆盘的大小依次为 1 到 n。
每次,可以将一个盘子从一根柱子上移动到另一根柱子上,这个盘子必须是柱子最上方的盘子,而且移到的柱子上的盘子必须比这个盘子大。
小蓝的目标是将所有的盘子移动到第三根柱子上。
汉诺塔是个经典问题,当盘子数量为 n 时,最少需要移动 2**n-1 步,其中 2**n 表示 2 的 n 次方。
小蓝已经玩了一会儿(不一定按最优方案玩),他想知道,对于他目前的局面,最少还需要多少步可以到达目标。
输入格式
输入的第一行包含三个非负整数 a, b, c,分别表示目前每根柱子上的盘子数。在本题中,n=a+b+c。
第二行包含 a 个整数,相邻的整数之间使用一个空格分隔,表示第一根柱子上的盘子,盘子按从上到下(从小到大)的顺序给出。
第三行包含 b 个整数,相邻的整数之间使用一个空格分隔,表示第二根柱子上的盘子,盘子按从上到下(从小到大)的顺序给出。
第四行包含 c 个整数,相邻的整数之间使用一个空格分隔,表示第三根柱子上的盘子,盘子按从上到下(从小到大)的顺序给出。
输出格式
输出一行包含一个整数,表示答案。
样例输入
1 2 3
1
2 3
4 5 6
样例输出
7
评测用例规模与约定
对于 30% 的评测用例,2 <= n <= 5。
对于所有评测用例,2 <= n <= 60。
汉诺塔,不愧是压轴题,昨天下午想了半个小时没有思路,摆烂了,不做,还请评论区的大神来写
最后
如果我的文章对你有一点点的帮助,还希望可以小手点个赞,三连就更棒了!!
秋名山的路,我们一起走过!!!
- 点赞
- 收藏
- 关注作者
评论(0)