2021年 第12届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】


  1. 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结
  2. 2014年 第05届 蓝桥杯 Java B组 省赛真题详解及小结
  3. 2015年 第06届 蓝桥杯 Java B组 省赛真题详解及小结
  4. 2016年 第07届 蓝桥杯 Java B组 省赛真题详解及小结
  5. 2017年 第08届 蓝桥杯 Java B组 省赛真题详解及小结
  6. 2018年 第09届 蓝桥杯 Java B组 省赛真题详解及小结
  7. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及小结
  8. 2020年 第11届 蓝桥杯 第1次模拟赛真题详解及小结【Java版】(校内模拟)// 官方讲解视频
  9. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】// 官方讲解视频
  10. 2020年 第11届 蓝桥杯 C/C++ B组 省赛真题详解及小结【第1场省赛 2020.07.05】【Java版】
  11. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.07.05】
  12. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第2场省赛 2020.10.17】
  13. 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.07.05】
  14. 2021年 第12届 蓝桥杯 第1次模拟赛真题详解及小结【Java版】
  15. 2021年 第12届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】
  16. 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结

  1. 2015年 第06届 蓝桥杯 Java B组 决赛真题详解及小结
  2. 2016年 第07届 蓝桥杯 Java B组 决赛真题详解及小结
  3. 2017年 第08届 蓝桥杯 Java B组 决赛真题详解及小结
  4. 2018年 第09届 蓝桥杯 Java B组 决赛真题详解及小结
  5. 2019年 第10届 蓝桥杯 Java B组 决赛真题详解及小结
  6. 2020年 第11届 蓝桥杯 Java B组 决赛真题详解及小结

 

目   录

模拟赛网页截图

一、试题A——答案:168

解法一:循环+check

二、试题B——答案:14

解法一:进制转换

三、试题C——答案:2002

解法一:暴力循环+check

四、试题D——答案:65

解法一:找规律(累加求和)

五、试题E——答案:162

解法一:双重for循环遍历所有组合

六、试题F

解法一:整数相乘

七、试题G

解法一:整数运算

解法二:计算增加的小时数

八、试题H

解法一

九、试题I

解法一

十、试题J

解法一

小结


仅供参考,欢迎指正!

模拟赛网页截图

一、试题A——答案:168

问题描述

  请问在 1 到 2020 中,有多少个数既是 4 的整数倍,又是 6 的整数倍。

答案提交

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解法一:循环+check

【答案】:168

package simulationMatch_12_2021_2;

public class _01A {

	public static void main(String[] args) {
		int answer = 0;
		for (int i = 1; i <= 2020; i++) {
			if (i % 4 == 0 && i % 6 == 0) {
				answer++;
				System.out.print(i + "、");
			}
		}
		System.out.println();
		System.out.println(answer);
	}

}

二、试题B——答案:14

问题描述

  小明要用二进制来表示 1 到 10000 的所有整数,要求不同的整数用不同的二进制数表示,请问,为了表示 1 到 10000 的所有整数,至少需要多少个二进制位?

答案提交

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解法一:进制转换

【答案】:14

【解析】:1 到 10000 的所有整数中,最大的数字为10000,十进制数字10000 转 二进制 为:10 0111 0001 0000,用了14位二进制位。

在线进制转换网址:https://tool.oschina.net/hexconvert

package simulationMatch_12_2021_2;

public class _02B {

	public static void main(String[] args) {
		for (int i = 1; i <= 10000; i++) {
			String temp = Integer.toBinaryString(i);
			System.out.println(temp);
		}
	}

}

三、试题C——答案:2002

问题描述

  请问有多少个序列满足下面的条件:
  1. 序列的长度为 5。
  2. 序列中的每个数都是 1 到 10 之间的整数。
  3. 序列中后面的数大于等于前面的数。

答案提交

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解法一:暴力循环+check

【答案】:2002

package simulationMatch_12_2021_2;

public class _03C {

	public static void main(String[] args) {
		int answer = 0;
		for (int a = 1; a <= 10; a++) {
			for (int b = 1; b <= 10; b++) {
				for (int c = 1; c <= 10; c++) {
					for (int d = 1; d <= 10; d++) {
						for (int e = 1; e <= 10; e++) {
							if (a <= b && b <= c && c <= d && d <= e) {
								answer++;
								System.out.println(a + "、" + b + "、" + c + "、" + d + "、" + e);
							}
						}
					}
				}
			}
		}
		System.out.println(answer);
	}

}

四、试题D——答案:65

问题描述

  一个无向图包含 2020 条边,如果图中没有自环和重边,请问最少包含多少个结点?

答案提交

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解法一:找规律(累加求和)

【答案】:65

【解析】:自环(Loop):若一条边的两个顶点为同一顶点,则此边称作自环。

题中所求的是“最少包含多少个结点”,64个节点最多包含2080条边,63个节点最多包含2017条边。

package simulationMatch_12_2021_2;

public class _04D {
	public static void main(String[] args) {
		int sum = 0;
		for (int i = 1; i <= 2019; i++) {
			sum += i;
			if (sum >= 2020) {
				System.out.println(i);
				break;
			}
		}

		int sum64 = 0; // 65个节点
		for (int i = 1; i <= 64; i++) {
			sum64 += i;
		}
		System.out.println("65个节点-sum64:" + sum64);

		int sum63 = 0; // 64个节点
		for (int i = 1; i <= 63; i++) {
			sum63 += i;
		}
		System.out.println("64个节点-sum63:" + sum63);

		int sum62 = 0; // 63个节点
		for (int i = 1; i <= 62; i++) {
			sum62 += i;
		}
		System.out.println("63-个节点sum62:" + sum62);
	}
}

五、试题E——答案:162

问题描述

  两个字母之间的距离定义为它们在字母表中位置的距离。例如 A 和 C 的距离为 2,L 和 Q 的距离为 5。
  对于一个字符串,我们称字符串中两两字符之间的距离之和为字符串的内部距离。
  例如:ZOO 的内部距离为 22,其中 Z 和 O 的距离为 11。
  请问,LANQIAO 的内部距离是多少?

答案提交

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

解法一:双重for循环遍历所有组合

【答案】:162

【解析】:挨个遍历。

        

package simulationMatch_12_2021_2;

public class _05E {

	public static void main(String[] args) {
		char arr1[] = "ZOO".toCharArray();
		char arr2[] = "LANQIAO".toCharArray();
//		System.out.println(arr1[0] - 'O');
//		System.out.println(arr1[1] - 'A');
//		System.out.println(arr1[2] - 'A');
		solve(arr1);
		System.out.println("--- --- ---");
		solve(arr2);
	}

	public static void solve(char arr[]) {
		int answer = 0;
		for (int i = 0; i < arr.length - 1; i++) { // [0, 5]
			for (int j = i + 1; j < arr.length; j++) {
				System.out.println(arr[i] + "" + arr[j]);
				answer += Math.abs((arr[i] - '0') - (arr[j] - '0'));
			}
			System.out.println("---");
		}
		System.out.println(answer);
	}

}

六、试题F

问题描述

  给定一个平行四边形的底边长度 l 和高度 h,求平行四边形的面积。

输入格式

  输入的第一行包含一个整数 l,表示平行四边形的底边长度。
  第二行包含一个整数 h,表示平行四边形的高。

输出格式

  输出一个整数,表示平行四边形的面积。(提示:底边长度和高都是整数的平行四边形面积为整数)

样例输入

2
7

样例输出

14

数据规模和约定

  对于所有评测用例,1 <= l, h <= 100。

解法一:整数相乘

package simulationMatch_12_2021_2;

import java.util.Scanner;

public class _06F {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int l = sc.nextInt(); // 1 <= l, h <= 100
		int h = sc.nextInt();
		System.out.println(l * h);
	}

}

七、试题G

问题描述

  现在时间是 a 点 b 分,请问 t 分钟后,是几点几分?

输入格式

  输入的第一行包含一个整数 a。
  第二行包含一个整数 b。
  第三行包含一个整数 t。

输出格式

  输出第一行包含一个整数,表示结果是几点。
  第二行包含一个整数,表示结果是几分。

样例输入

3
20
165

样例输出

6
5

样例输入

3
20
175

样例输出

6
15

数据规模和约定

  对于所有评测用例,0 <= a <= 23, 0 <= b <= 59, 0 <= t, t 分钟后还是在当天。

解法一:整数运算

【解析】:先 初步 粗略地 更新 hour,然后 根据 minute的值 判断 hour的值 是否 需要 继续 更新。

package simulationMatch_12_2021_2;

import java.util.Scanner;

public class _07G {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int t = sc.nextInt();

		int hour = a + t / 60;
		int minute = b + t % 60;
		if (minute >= 60) {
			minute -= 60;
			hour++;
		}
		System.out.println(hour);
		System.out.println(minute);
	}

}

解法二:计算增加的小时数

原文链接:Hand-design-蓝桥杯第十二届第二期模拟赛

package simulationMatch_12_2021_2;

import java.util.Scanner;

public class _07G2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		int t = sc.nextInt();
		int c, d, m;
		d = (b + t) % 60; // 分钟
		m = (b + t) / 60; // 增加的小时数
		c = a + m; // 小时
		System.out.println(c);
		System.out.println(d);
	}

}

八、试题H

问题描述

  小蓝有一张黑白图像,由 n * m 个像素组成,其中从上到下共 n 行,每行从左到右 m 列。每个像素由一个 0 到 255 之间的灰度值表示。
  现在,小蓝准备对图像进行模糊操作,操作的方法为:
  对于每个像素,将以它为中心 3 * 3 区域内的所有像素(可能是 9 个像素或少于 9 个像素)求和后除以这个范围内的像素个数(取下整),得到的值就是模糊后的结果。
  请注意每个像素都要用原图中的灰度值计算求和。

输入格式

  输入的第一行包含两个整数 n, m。
  第 2 行到第 n + 1 行每行包含 m 个整数,表示每个像素的灰度值,相邻整数之间用一个空格分隔。

输出格式

  输出 n 行,每行 m 个整数,相邻整数之间用空格分隔,表示模糊后的图像。

样例输入

3 4
0 0 0 255
0 0 255 0
0 30 255 255

样例输出

0 42 85 127
5 60 116 170
7 90 132 191

数据规模和约定

  对于所有评测用例,1 <= n, m <= 100。

解法一

原文链接:咖啡果冻-蓝桥杯第十二届校内模拟赛(第二期)个人做题答案 仅供参考

package simulationMatch_12_2021_2;

import java.util.Scanner;

public class _08H {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int m = in.nextInt();
		int[][] image = new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				image[i][j] = in.nextInt();
			}
		}
		int[][] newPicture = handle(image);
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				System.out.print(newPicture[i][j] + " ");
			}
			System.out.println();
		}
	}

	public static int[][] handle(int[][] image) {
		int n = image.length;
		if (n == 0) {
			return null;
		}
		int m = image[0].length;
		int[][] newPicture = new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				int sum = 0;
				int count = 0;
				for (int k = 0; k < 9; k++) { // 这个循环用来遍历以 (i,j)为中心的3*3的矩形里面的每个像素块
					int n_x = (i - 1) + k / 3; // 这里向下取整
					int n_y = (j - 1) + k % 3;
					if (isArea(n, m, n_x, n_y)) {
						sum += image[n_x][n_y]; // 计算像素和
						count++; // 计算像素个数
					}
				}
				newPicture[i][j] = sum / count; // 向下取整
			}
		}
		return newPicture;
	}

	public static boolean isArea(int row, int col, int i, int j) {
		return i >= 0 && i < row && j >= 0 && j < col;
	}

}

九、试题I

问题描述

  小蓝负责花园的灌溉工作。
  花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。
  小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。
  每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。
  给定花园水管的位置,请问 k 分钟后,有多少个方格被灌溉好?

输入格式

  输入的第一行包含两个整数 n, m。
  第二行包含一个整数 t,表示出水管的数量。
  接下来 t 行描述出水管的位置,其中第 i 行包含两个数 r, c 表示第 r 行第 c 列有一个排水管。
  接下来一行包含一个整数 k。

输出格式

  输出一个整数,表示答案。

样例输入

3 6
2
2 2
3 4
1

样例输出

9

样例说明

  用1表示灌溉到,0表示未灌溉到。
  打开水管时:
  000000
  010000
  000100
  1分钟后:
  010000
  111100
  011110
  共有9个方格被灌溉好。

数据规模和约定

  对于所有评测用例,1 <= n, m <= 100, 1 <= t <= 10, 1 <= k <= 100。

解法一

原文链接:咖啡果冻-蓝桥杯第十二届校内模拟赛(第二期)个人做题答案 仅供参考

package simulationMatch_12_2021_2;

import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;

public class _09I {

	public static void main(String[] args) {
		int[][] direction = { { -1, 0 }, { 0, -1 }, { 0, 1 }, { 1, 0 } };
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int m = in.nextInt();
		int[][] garden = new int[n][m];
		int tap = in.nextInt();
		for (int i = 0; i < tap; i++) {
			int r = in.nextInt();
			int c = in.nextInt();
			garden[r - 1][c - 1] = 1;
		}
		int time = in.nextInt();
		int res = watering(garden, time, tap, direction);
		System.out.println(res);
	}

	public static int watering(int[][] garden, int time, int tap, int[][] direction) { // 浇水
		if (time <= 0) {
			return tap;
		}
		int count = 0;
		int n = garden.length;
		int m = garden[0].length;
		Queue<Node> q = new LinkedList<>();
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (garden[i][j] == 1) {
					q.add(new Node(i, j));
				}
			}
		}
		while (time > 0) {
			int size = q.size();
			for (int i = 0; i < size; i++) {
				Node temp = q.poll();
				int x = temp.row;
				int y = temp.col;
				for (int j = 0; j < 4; j++) {
					int n_x = x + direction[j][0];
					int n_y = y + direction[j][1];
					if (isArea(n, m, n_x, n_y)) {
						garden[n_x][n_y] = 1;
						q.offer(new Node(n_x, n_y));
					}
				}
			}
			time--;
		}
		for (int i = 0; i < n; i++) {// 浇完水之后再统计数量
			for (int j = 0; j < m; j++) {
				if (garden[i][j] == 1) {
					count++;
				}
			}
		}
		return count;
	}

	public static boolean isArea(int row, int col, int x, int y) {
		return 0 <= x && x < row && y >= 0 && y < col;
	}

}

class Node { // 这个类用来表示一个点 有row 和 col 表示坐标
	int row;
	int col;
	public Node(int row, int col) {
		this.row = row;
		this.col = col;
	}
}

十、试题J

问题描述

  小蓝在一个 n 行 m 列的方格图中玩一个游戏。
  开始时,小蓝站在方格图的左上角,即第 1 行第 1 列。
  小蓝可以在方格图上走动,走动时,如果当前在第 r 行第 c 列,他不能走到行号比 r 小的行,也不能走到列号比 c 小的列。同时,他一步走的直线距离不超过3。
  例如,如果当前小蓝在第 3 行第 5 列,他下一步可以走到第 3 行第 6 列、第 3 行第 7 列、第 3 行第 8 列、第 4 行第 5 列、第 4 行第 6 列、第 4 行第 7 列、第 5 行第 5 列、第 5 行第 6 列、第 6 行第 5 列之一。
  小蓝最终要走到第 n 行第 m 列。
  在图中,有的位置有奖励,走上去即可获得,有的位置有惩罚,走上去就要接受惩罚。奖励和惩罚最终抽象成一个权值,奖励为正,惩罚为负。
  小蓝希望,从第 1 行第 1 列走到第 n 行第 m 列后,总的权值和最大。请问最大是多少?

输入格式

  输入的第一行包含两个整数 n, m,表示图的大小。
  接下来 n 行,每行 m 个整数,表示方格图中每个点的权值。

输出格式

  输出一个整数,表示最大权值和。

样例输入

3 5
-4 -5 -10 -3 1
7 5 -9 3 -10
10 -2 6 -10 -4

样例输出

15

数据规模和约定

  对于30%的评测用例,1 <= n, m <= 10;
  对于50%的评测用例,1 <= n, m <= 20;
  对于所有评测用例,1 <= n <= 100,-10000 <= 权值 <= 10000。

解法一

原文链接:咖啡果冻-蓝桥杯第十二届校内模拟赛(第二期)个人做题答案 仅供参考

package simulationMatch_12_2021_2;

import java.util.Scanner;
import java.util.Arrays;

public class _10J {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int m = in.nextInt();
		int[][] map = new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				map[i][j] = in.nextInt();
			}
		}
		int res = getMaxPath(map);
		System.out.println(res);
	}

	public static int getMaxPath(int[][] map) {
		int n = map.length;
		int m = map[0].length;
		int[][] dp = new int[n][m];
		for (int i = 0; i < n; i++) {
			Arrays.fill(dp[i], Integer.MIN_VALUE);
		}
		dp[0][0] = map[0][0];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				for (int step = 1; step <= 3; step++) {// 三种状态到达该点 走1 2 3 步
					for (int right = 0; right <= step; right++) {
						int down = step - right;
						int n_x = i - down;
						int n_y = j - right;
						if (isArea(n, m, n_x, n_y)) {
							dp[i][j] = Math.max(dp[i][j], map[i][j] + dp[n_x][n_y]);
						}
					}
				}
			}
		}
		return dp[n - 1][m - 1];
	}

	public static boolean isArea(int row, int col, int x, int y) {
		return 0 <= x && x < row && y >= 0 && y < col;
	}

}

小结

  • 简单题,拿满分;
  • 难题,尽量拿分。

我昨天中午才考完试(2020年1月13日 12:20),今天(2020年1月14日)下午写的。

2021年 第12届 蓝桥杯 第1次模拟赛真题详解及小结,有网友期待第2期。谢谢大家,祝大家蓝桥杯得好奖!

猜你喜欢

转载自blog.csdn.net/weixin_44949135/article/details/112560390