⭐️引言⭐️
大家好,我是执梗。这几天蓝桥杯的省赛模拟赛正在开展,报名费一人三十元(没错又是丰收的结节,开始割韭菜了)。昨天抽空做了一下,虽然没有出成绩,但是难度确实不高,和这两届的真题难度比起来有点差距(更像是十年前的蓝桥题😂)。不过有的做不做白不做,有的题目还是挺有蓝桥特色的。顺便说一句,因为题目都没有名字,所以以下的题名都是我自取的😐。题目已整理为PDF,如果想要真题的可以拉到文章末尾。
⭐️精彩回放⭐️
蓝桥真题5 | 【蓝桥真题五】带三百人训练了十天精选蓝桥真题,看看他们都练些什么(三门语言题解)_执 梗的博客-CSDN博客 |
蓝桥真题4 | 【蓝桥真题4】练练填空就想进国赛?拿下大题才能让你真正有底气(蓝桥31日冲刺打卡)_执 梗的博客-CSDN博客 |
蓝桥真题3 | 【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可_执 梗的博客-CSDN博客_蓝桥杯进国赛难不难 |
蓝桥真题2 | 【蓝桥真题2】蓝桥杯不会全排列,那就只能写10个for循环了【内附近8年真题资源】_执 梗的博客-CSDN博客 |
蓝桥真题1 | 【蓝桥真题1】这道用了7个for循环的蓝桥真题,让舍友哭着跑出考场【内附原题资源】_执 梗的博客-CSDN博客 |
⭐️目录⭐️
🍺1.A的个数
🍻 2.最2数字
🍸3.最少次数
🍹4.超大玉螺旋丸
🍷 5.二叉树的最大深度
🍦6.和尚挑水
🍨7.金融数字
🍧8.插座
🍫 9.公约数
🍬10.汉诺塔
🍺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?
第一题打卡题,非常让人舒服的题目,不过做了和没做对自己都没啥帮助哈哈哈。
代码转换:
public class Main4 {
public static void main(String[] args) {
String a="AAAAAAABABBAABABABAAAAAAA\r\n" +
" ABBBBBABBAABBBBBABABBBBBA\r\n" +
" ABAAABABBBABAABBBBABAAABA\r\n" +
" ABAAABABBBBBAABAABABAAABA\r\n" +
" ABAAABABBABABBABABABAAABA\r\n" +
" ABBBBBABBBABAABBBBABBBBBA\r\n" +
" AAAAAAABABABABABABAAAAAAA\r\n" +
" BBBBBBBBABAABABBBBBBBBBBB\r\n" +
" AABAABABBAAABBAAABABBBBBA\r\n" +
" ABBABABBBABBAAAABBBBAAAAB\r\n" +
" BBBBAAABABAABABAABBBAABBA\r\n" +
" BBAABABABAAAABBBAABBAAAAA\r\n" +
" ABABBBABAABAABABABABBBBBA\r\n" +
" AAAABBBBBABBBBAAABBBABBAB\r\n" +
" AABAABAAABAAABAABABABAAAA\r\n" +
" ABBBBBBBBABABBBBABAABBABA\r\n" +
" ABBBAAABAAABBBAAAAAAABAAB\r\n" +
" BBBBBBBBABBAAABAABBBABBAB\r\n" +
" AAAAAAABBAAABBBBABABAABBA\r\n" +
" ABBBBBABBAABABAAABBBABBAA\r\n" +
" ABAAABABABBBAAAAAAAAAABAA\r\n" +
" ABAAABABABABBBABBAABBABAA\r\n" +
" ABAAABABBABBABABAABAABAAA\r\n" +
" ABBBBBABABBBBBABBAAAABAAA\r\n" +
" AAAAAAABAABBBAABABABBABBA";
char[] s=a.toCharArray();
int ans=0;
for(int i=0;i<s.length;++i) {
if(s[i]=='A') ans++;
}
System.out.println(ans);//318
}
}
🍻 2.最2数字
如果一个整数的某个数位包含 2 ,则称这个数为一个“最2数字”。例如:102、2021 都是最2数字。
请问在 1(含) 到 2021(含) 中,有多少个最2数字。
不知道为啥蓝桥杯这几年和数字2杠上了,经常出这种和2有关的题目,不过难度一般都是非常友好的,对于大家来说只要细心一点都不会错,也是属于签到的题目。
代码转换:
public class Main2 {
public static void main(String[] args) {
int ans=0;
for(int i=1;i<=2021;++i) {
if(check(i)) ans++;
}
System.out.println(ans);//564
}
static boolean check(int n) {
while(n!=0) {
if(n%10==2) return true;
n/=10;
}
return false;
}
}
🍸3.最少次数
有一个整数 A=2021,每一次,可以将这个数加 1 、减 1 或除以 2,其中除以 2 必须在数是偶数的时候才允许。
例如,2021 经过一次操作可以变成 2020、2022。
再如,2022 经过一次操作可以变成 2021、2023 或 1011。
请问,2021 最少经过多少次操作可以变成 1。
非常非常经典的题目,力扣上甚至有许多类似的题目,大家有兴趣可以去搜索一下,具体的题目名字我也忘记了。这里由于求的是最少的操作,具有最短路的性质,所以我用的是BFS来搜索。当然这道题的做法有非常多,但我觉得这类题通用BFS模板既不容易出错也能写的更快,何乐而不为呢?
为什么想到用BFS呢?因为对于每个数只有+1,-1,/2的操作。而我们平时图论中搜索是可以上下左右,第一次走到的地方一定是最短路径,而我们这里同理,每个数有+1,-1,/2的三种走法(当然奇数只有前两种),每次我们得到一个新数时,一定是通过最少的操作次数得到它。(如果你学过BFS就能明白,没学过肯定不懂,所以还是先掌握好BFS,当然这题也有其他的做法)
public class Main3 {
public static void main(String[] args) {
//数组开个10000完全够用了
boolean[] visit=new boolean[10000];
Queue<Integer> queue=new LinkedList<>();
queue.offer(2021);
visit[2021]=true;
//记录答案
int time=0;
//BFS模板走起
while(!queue.isEmpty()) {
int size=queue.size();
while(size-->0) {
int curr=queue.poll();
//判断curr如果是1则直接输出time就是我们的答案
if(curr==1) {
System.out.println(time);//14
return;
}
if(!visit[curr+1]) {
visit[curr+1]=true;
queue.offer(curr+1);
}
if(!visit[curr-1]) {
visit[curr-1]=true;
queue.offer(curr-1);
}
//一定要记住,只有偶数才可以选择除以2的操作
if(curr%2==0&&!visit[curr/2]) {
visit[curr/2]=true;
queue.offer(curr/2);
}
}
time++;
}
}
}
🍹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 列的值是多少?
这个题名有点中二了哈哈哈哈哈哈哈,原谅看到这个题目一下想到鸣人。这道题还是有点意思的,有点蓝桥特色。而且这题目在力扣中是有类似的原题的(某个小伙伴告诉我的,非常感谢),直接打印出这个矩阵,然后输出答案即可。问题是如何打印呢?这里我用的是卡神题解中的模板打印,这里我不过多讲解,因为力扣评论区有非常多的大佬详解,这里也附上类似力扣类似原题链接:螺旋矩阵||
本来想用Excel拉出这个表格,但发现一旦左拉或者上拉就会递减,确实不会。如果有会的小伙伴也可以评论区或者私信教我一下,非常感谢😂
代码转换:
public class Main4 {
public static void main(String[] args) {
int[][] arr=generateMatrix(30);
//注意第二十行二十列的下标应该是19,19
System.out.println(arr[19][19]);//819
}
//返回的二维数组就是打印好的数组
public static int[][] generateMatrix(int n) {
int l = 0, r = n - 1, t = 0, b = n - 1;
int[][] mat = new int[n][n];
int num = 1, tar = n * n;
while(num <= tar){
for(int i = l; i <= r; i++) mat[t][i] = num++; // left to right.
t++;
for(int i = t; i <= b; i++) mat[i][r] = num++; // top to bottom.
r--;
for(int i = r; i >= l; i--) mat[b][i] = num++; // right to left.
b--;
for(int i = b; i >= t; i--) mat[i][l] = num++; // bottom to top.
l++;
}
return mat;
}
}
🍷 5.二叉树的最大深度
一棵二叉树有2021个结点。该树满足任意结点的左子树结点个数和右子树的结点个数之差最多为1。
定义根结点的深度为0,子结点的深度比父结点深度多1。
请问,树中深度最大的结点的深度最大可能是多少?
左子树结点个数和右子树的结点个数之差最多为1,这句话的意思应该是这棵树是一颗完全二叉树。 根据完全二叉树的结点个数获得深度的公式是long2(N)+1。但这里说定义根节点的深度为0,所以我们不需要再加一,我得出来的答案是long(2021)~=10,最多是十层。
如果有错,还望评论区纠正。
🍦6.和尚挑水
问题描述
一个和尚要挑水,每次最多能挑 a 千克,水缸最多能装 t 千克,开始时水缸为空。
请问这个和尚最少要挑多少次可以将水缸装满?输入格式
输入一行包含两个整数 a, t,用一个空格分隔。
输出格式
输出一行包含一个整数,表示答案。
样例输入
20 2021
样例输出
102
评测用例规模与约定
对于所有评测用例,1 <= a <= 100,1 <= t <= 10000。
这道题,emmmm,没什么好说的,不亏是大题第一道签到题。
public class Main6 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int t=sc.nextInt();
if(t%a==0) {
System.out.println(t/a);
}else{
System.out.println(t/a+1);
}
}
}
🍨7.金融数字
问题描述
在金融领域,通常将金额的百位和千位之间、十万位和百万位之间增加逗号(千分位分隔符),以方便阅读。一般从个位开始,每三位之前增加一个逗号。
例如:1234567890.00 通常写成 1,234,567,890.00。
注意小数点后固定保留 2 位。
给定一个包含千分位分隔符的数值,请读入后输出对应的不含千分位的数值,小数点仍然保留 2 位。输入格式
输入一行包含一个由千分位分隔符的数值,恰好有 2 位小数。
输出格式
输出不含千分位分隔符的数值,保留 2 位小数。
样例输入
1,234,567,890.00
样例输出
1234567890.00
评测用例规模与约定
对于所有评测用例,给定的数值整数部分不超过12位。
不知道这道题想考啥,我是字符串模拟,把所有逗号都去掉了。
public class Main7 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.next();
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();++i) {
if(s.charAt(i)!=',') {
sb.append(s.charAt(i));
}
}
System.out.println(sb);
}
}
🍧8.插座
问题描述
小蓝有一个插板,形状用一个 n * m 的01矩阵表示,0 表示板面,1 表示插孔。
小蓝还有一个插头,形状用一个 r * c 的01矩阵表示,0 表示没有伸出的部分,1 表示伸出的部分。插头伸出的部分必须插在插孔里面。
为了安全,插头插到面板上不能有任何部分超过插板边界(包括没有伸出的部分)。
插头和插板都不能旋转,也不能翻转。请求出插头插入插板的合理位置。输入格式
输入的第一行包含两个整数 n, m。
接下来 n 行,每行一个长度为 m 的01串,表示插板的形状。
接下来一行包含两个整数 r, c。
接下来 r 行,每行一个长度为 c 的01串,表示插头的形状。输出格式
如果插头没办法安全插入插板中,输出“NO”。否则输出两个数 a, b,表示插头的第 1 行第 1 列对应插板的第 a 行第 b 列。如果有多种情况满足要求,输出 a 最小的方案,如果 a 最小的方案有多个,输出在 a 最小的前提下 b 最小的方案。
样例输入
3 4
0110
0000
0000
3 3
000
010
000样例输出
NO
样例说明
在插头不超出范围的前提下无法插入。
样例输入
4 7
1110100
1101111
0001111
0000011
2 3
111
011样例输出
2 4
评测用例规模与约定
对于 50% 的评测用例,2 <= n, m, r, c <= 20。
对于所有评测用例,2 <= n, m, r, c <= 100。
这个题严格意义上算是一个模拟题。主要注意的点有一下几点:
- 如果插板的长或者宽小于插头,就可以直接返回NO了
- 插头为1的地方,插板必须为1。插头为0的地方,插板为0和1都是符合要求的。并不需要插板和插头完全一样
- 因为数据范围不大,我们只用从小到大去枚举一下起始位置,找到的第一个符合的位置就是我们的答案
代码转换:
public class Main8 {
static List<int[]> list=new ArrayList<>();
static char[][] arr,nums;
static int n,m,r,c;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
arr=new char[n][m];
for(int i=0;i<n;++i) {
arr[i]=sc.next().toCharArray();
}
r=sc.nextInt();
c=sc.nextInt();
nums=new char[r][c];
for(int i=0;i<r;++i) {
nums[i]=sc.next().toCharArray();
}
//特判,这种情况不符合直接返回NO
if(r>n||c>m) {
System.out.println("NO");
return;
}
//注意我们输出的是第几列第几行而不是下标
for(int i=0;i+r-1<n;++i) {
for(int j=0;j+c-1<m;++j) {
if(check(i,j)) {
System.out.println((i+1)+" "+(j+1));
return;
}
}
}
System.out.println("NO");
}
//一个判断以[a][b]为起始位是否能插入插头的方法
static boolean check(int a,int b) {
for(int i=0;i<r;++i) {
for(int j=0;j<c;++j) {
if(nums[i][j]=='1'&&arr[i+a][j+b]=='0') return false;
}
}
return true;
}
}
🍫 9.公约数
问题描述
给定正整数 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次方)。
题目比较简单,但是注意数的范围比较大,存储答案的话应该使用long类型。我的思路主要是用Set去存储答案,这样可以忽略当i==n/i这种情况,因为Set可以自动去重。遍历a时把a的约数放入set1中,遍历b的约数时如果发现set1也存在这个数,则可以把它放入set2和答案数组中,当然答案我也是用set存储,还是那个原因,它可以去重。最后遍历c时,判断约数是否也在set1或者set2即可。这样不重不漏找出所有符合条件的约数,最后答案数组的长度就是答案。
代码转换:
public class Main9 {
static Set<Long> set1=new HashSet<Long>();
static Set<Long> set2=new HashSet<Long>();
//用来存放答案
static Set<Long> anser=new HashSet<Long>();
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long a=sc.nextLong();
long b=sc.nextLong();
long c=sc.nextLong();
check1(a);
check2(b);
check3(c);
System.out.println(anser.size());
}
//遍历a
static void check1(long n) {
for(Long i=1L;i<=n/i;++i) {
if(n%i==0) {
set1.add(i);
set1.add(n/i);
}
}
}
//遍历b
static void check2(long n) {
for(Long i=1L;i<=n/i;++i) {
if(n%i==0) {
set2.add(i);
set2.add(n/i);
if(set1.contains(i)) anser.add(i);
if(set1.contains(n/i)) anser.add(n/i);
}
}
}
//遍历c
static void check3(long n) {
for(Long i=1L;i<=n/i;++i) {
if(n%i==0) {
if(set1.contains(i)||set2.contains(i)) anser.add(i);
if(set2.contains(n/i)||set2.contains(n/i)) anser.add(n/i);
}
}
}
}
🍬10.汉诺塔
问题描述
小蓝很喜欢玩汉诺塔游戏。
游戏中有三根柱子,开始时第一根柱子上有 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。
小蓝不按最优套路玩,没有太大的思路做。哈哈哈,会的小伙伴可以评论区留言。
需要PDF版考题的可以直接私信我留言蓝桥模拟题即可。
如果我的文章对你有一点点的帮助,还希望可以小手点个赞,当然三连会更开心😆