- 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】
- 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结
- 2014年 第05届 蓝桥杯 Java B组 省赛真题详解及小结
- 2015年 第06届 蓝桥杯 Java B组 省赛真题详解及小结
- 2016年 第07届 蓝桥杯 Java B组 省赛真题详解及小结
- 2017年 第08届 蓝桥杯 Java B组 省赛真题详解及小结
- 2018年 第09届 蓝桥杯 Java B组 省赛真题详解及小结
- 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及小结
- 2020年 第11届 蓝桥杯 第1次模拟赛真题详解及小结【Java版】(校内模拟)// 官方讲解视频
- 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】// 官方讲解视频
- 2020年 第11届 蓝桥杯 C/C++ B组 省赛真题详解及小结【第1场省赛 2020.07.05】【Java版】
- 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.07.05】
- 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第2场省赛 2020.10.17】
- 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.07.05】
- 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】
- 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第2场省赛 2021.05.09】
- 2022年 第13届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2022.04.09】
- 2015年 第06届 蓝桥杯 Java B组 决赛真题详解及小结
- 2016年 第07届 蓝桥杯 Java B组 决赛真题详解及小结
- 2017年 第08届 蓝桥杯 Java B组 决赛真题详解及小结
- 2018年 第09届 蓝桥杯 Java B组 决赛真题详解及小结
- 2019年 第10届 蓝桥杯 Java B组 决赛真题详解及小结
- 2020年 第11届 蓝桥杯 Java B组 决赛真题详解及小结【2020.11.14】
- 2021年 第12届 蓝桥杯 Java B组 决赛真题详解及小结【2021.06.05】
- 2022年 第13届 蓝桥杯 Java B组 决赛真题详解及小结【2022.00.00】
目录
一、试题A:整数范围(本题总分:5 分)
01解法一
二、试题B:纯质数(本题总分:5 分)
02解法一
三、试题C:完全日期(本题总分:10 分)
03解法一
四、试题D:最小权值(本题总分:10 分)
04解法一
五、试题E:大写(时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分)
05解法一
六、试题F:123(时间限制: 5.0s 内存限制: 512.0MB 本题总分:15 分)
06解法一
七、试题G:和与乘积(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)
07解法一
八、试题H:巧克力(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)
08解法一
九、试题I:翻转括号序列(时间限制: 10.0s 内存限制: 768.0MB 本题总分:25 分)
09解法一
十、试题J:异或三角(时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分)
10解法一
小结
参考博客:
- 2021 第十二届 蓝桥杯 国赛决赛 Java B组 真题 详细解析_Listssoh的博客-CSDN博客_蓝桥杯java
仅供参考,欢迎指正!部分为个人想法和解题思路,如有错误或不足,欢迎指正。
本题总分:5 分
【问题描述】
用 8 位二进制(一个字节)来表示一个非负整数,表示的最小值是 0,则一般能表示的最大值是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】:255
二进制00000000为十进制的0,11111111自然为十进制的255。
package national_12_2021;
public class A01_整数范围 {
public static void main(String[] args) {
System.out.println(Integer.parseInt("11111111", 2)); // 255
}
}
本题总分:5 分
【问题描述】
如果一个正整数只有 1 和它本身两个约数,则称为一个质数(又称素数)。
前几个质数是:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, · · · 。
如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2, 3, 5, 7, 23, 37 都是纯质数,而 11, 13, 17, 19, 29, 31 不是纯质数。当然 1, 4, 35 也不是纯质数。
请问,在 1 到 20210605 中,有多少个纯质数?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】:1903
package national_12_2021;
import java.util.ArrayList;
public class B02_纯质数 {
static int number = 20210605;// 测试的上限
static int map[] = new int[number];
static ArrayList ans = new ArrayList();
static int anscount = 0;
public static void main(String[] args) {
int count = 0;
// 此for循环找出范围内所有的质数
for (int i = 2; i <= number; i++) {
boolean add = true;
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) {
add = false;
continue;
}
}
if (add == true) {
map[count] = i;
count++;
}
}
//System.out.println("wanbi");
// 此for循环对每个质数进行判断
for (int i = 0; i < count; i++) {
String single = String.valueOf(map[i]);
//System.out.print(single+" ");
boolean shi = true;
// 将这个质数转化为字符串后将其的每一个字符转化为数字
flag: for (int j = 0; j < single.length(); j++) {
Integer wei = Integer.valueOf(single.charAt(j) - 48);
// 排除1和0
if (wei == 1 || wei == 0) {
shi = false;
break;
}
// 判断这个位数是不是质数
for (int k = 2; k * k <= wei; k++) {
if (wei % k == 0) {
shi = false;
break flag;
}
}
//System.out.print(wei+" ");
}
// 如果这个质数是纯质数的话,总和+1
if (shi == true) {
System.out.println(single);
ans.add(single);
anscount++;
}
//System.out.println();
}
// 调试时的输出语句
// for (int i = 0; i < count; i++) {
// System.out.print(map[i]+" ");
// }
// System.out.println();
// for (int i = 0; i < ans.size(); i++) {
// System.out.print(ans.get(i)+" ");
// }
System.out.println();
System.out.println(anscount);
}
}
本题总分:10 分
【问题描述】
如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。
例如:2021 年 6 月 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 16,而 16 是一个完全平方数,它是 4 的平方。所以 2021 年 6 月 5 日是一个完全日期。
例如:2021 年 6 月 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16,是一个完全平方数。所以 2021 年 6 月 23 日也是一个完全日期。
请问,从 2001 年 1 月 1 日到 2021 年 12 月 31 日中,一共有多少个完全日期?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】:977
package national_12_2021;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
public class C03_完全日期 {
static int anscount = 0;
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");// 指定输入格式
Date data = simpleDateFormat.parse("2001/01/01");// 获取指定日期的Data对象
// System.out.println(data);
Calendar calendar = Calendar.getInstance();
calendar.setTime(data);// 转化为对应的Calendar类的对象,以便利用其内现有的方法
calendar.add(Calendar.DAY_OF_YEAR, 1);// 获取后相差了一天,把它加回去
// System.out.println(calendar.toInstant());
int[] list = new int[10];
ArrayList index = new ArrayList();
for (int i = 1; i <= 20; i++) {
index.add(i * i);
}
// 输出一下,看产生的完全平方数对不对
// for (int i = 0; i < index.size(); i++) {
// System.out.print(index.get(i) + " ");
// }
// System.out.println();
for (int i = 1; i <= 7670; i++) {
StringBuilder yearsb = new StringBuilder();
StringBuilder monthsb = new StringBuilder();
StringBuilder daysb = new StringBuilder();
// 太多数据看不过来,调试时将下面这个if打开,筛掉一部分数据
// if(i<100 ||i>7600) {
String datastr = calendar.toInstant().toString();// 将此时calendar储存的日期转化为字符串
// 下面三个for从该字符串中获取年份的字符,
for (int j = 0; j < 4; j++) {
yearsb.append(datastr.charAt(j));
}
for (int j = 5; j < 7; j++) {
monthsb.append(datastr.charAt(j));
}
for (int j = 8; j < 10; j++) {
daysb.append(datastr.charAt(j));
}
// 紧接这的三个for将字符转换为数字
int count = 0;
for (int j = 0; j < yearsb.length(); j++) {
list[count] = Integer.valueOf(yearsb.charAt(j) - 48);
count++;
}
for (int j = 0; j < monthsb.length(); j++) {
list[count] = Integer.valueOf(monthsb.charAt(j) - 48);
count++;
}
for (int j = 0; j < daysb.length(); j++) {
list[count] = Integer.valueOf(daysb.charAt(j) - 48);
count++;
}
// 对所有数字进行累加
int sum = 0;
for (int j = 0; j < count; j++) {
// System.out.print(list[j]+" ");
sum += list[j];
}
// 判断是否在已经建立好的完全平方数表里面
boolean contains = index.contains(sum);
// 是的话计数器+1
if (contains == true) {
// System.out.println(" "+sum);
anscount++;
}
// }
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
System.out.println(anscount);
}
}
本题总分:10 分
【问题描述】
对于一棵有根二叉树 T,小蓝定义这棵树中结点的权值 W(T) 如下:
空子树的权值为 0。
如果一个结点 v 有左子树 L, 右子树 R,分别有 C(L) 和 C(R) 个结点,则 W(v) = 1 + 2W(L) + 3W(R) + (C(L))^2 C(R)。
树的权值定义为树的根结点的权值。
小蓝想知道,对于一棵有 2021 个结点的二叉树,树的权值最小可能是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【答案】:暂无!
暂无!
时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母 转换成大写字母后将字符串输出。
【输入格式】输入一行包含一个字符串。
【输出格式】输出转换成大写后的字符串。
【样例输入 1】LanQiao
【样例输出 1】LANQIAO
【评测用例规模与约定】对于所有评测用例,字符串的长度不超过 100。
package national_12_2021;
import java.util.Scanner;
public class E05_大写 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String next = cin.next();
String upperCase = next.toUpperCase();
System.out.println(upperCase);
}
}
时间限制: 5.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】
小蓝发现了一个有趣的数列,这个数列的前几项如下: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, ...
小蓝发现,这个数列前 1 项是整数 1,接下来 2 项是整数 1 至 2,接下来 3 项是整数 1 至 3,接下来 4 项是整数 1 至 4,依次类推。
小蓝想知道,这个数列中,连续一段的和是多少。
【输入格式】
输入的第一行包含一个整数 T,表示询问的个数。
接下来 T 行,每行包含一组询问,其中第 i 行包含两个整数 li 和 ri,表示询问数列中第 li 个数到第 ri 个数的和。
【输出格式】
输出 T 行,每行包含一个整数表示对应询问的答案。
【样例输入】
3
1 1
1 3
5 8【样例输出】
1
4
8【评测用例规模与约定】
对于 10% 的评测用例,1 ≤ T ≤ 30, 1 ≤ li ≤ ri ≤ 100。
对于 20% 的评测用例,1 ≤ T ≤ 100, 1 ≤ li ≤ ri ≤ 1000。
对于 40% 的评测用例,1 ≤ T ≤ 1000, 1 ≤ li ≤ ri ≤ 10^6。
对于 70% 的评测用例,1 ≤ T ≤ 10000, 1 ≤ li ≤ ri ≤ 10^9。
对于 80% 的评测用例,1 ≤ T ≤ 1000, 1 ≤ li ≤ ri ≤ 10^12。
对于 90% 的评测用例,1 ≤ T ≤ 10000, 1 ≤ li ≤ ri ≤ 10^12。
对于所有评测用例,1 ≤ T ≤ 100000, 1 ≤ li ≤ ri ≤ 10^12。
暂无!
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
给定一个数列 A = (a1, a2, · · · , an),问有多少个区间 [L, R] 满足区间内元素的乘积等于他们的和,即 aL · aL+1 · · · aR = aL + aL+1 + · · · + aR 。
【输入格式】
输入第一行包含一个整数 n,表示数列的长度。
第二行包含 n 个整数,依次表示数列中的数 a1, a2, · · · , an。
【输出格式】
输出仅一行,包含一个整数表示满足如上条件的区间的个数。
【样例输入】
4
1 3 2 2【样例输出】
6
【样例解释】
符合条件的区间为 [1, 1], [1, 3], [2, 2], [3, 3], [3, 4], [4, 4]。
【评测用例规模与约定】
对于 20% 的评测用例,n, m ≤ 3000;
对于 50% 的评测用例,n, m ≤ 20000;
对于所有评测用例,1 ≤ n, m ≤ 200000, 1 ≤ ai ≤ 200000。
package national_12_2021;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class G07_和与乘积 {
static int dp[][][] = new int[10002][10002][2];
static int list[] = new int[20002];
static int n;
public static void main(String[] args) throws IOException {
Scanner cin = new Scanner(System.in);
n = cin.nextInt();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1024);
// System.out.println("test1");
String[] split = br.readLine().split(" ");// 读入一整行,在用空格把这些数字分开
for (int i = 1; i <= split.length; i++) {
list[i] = Integer.valueOf(split[i - 1]);// 将字符串类型的数字转化为int类型,并存进数组里面
}
// System.out.println("test2");
// 下面两个for用于初始化dp数组(初始化上文示意图中4个黑色箭头所指的地方)
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
if (i == j) {
dp[i][j][0] = list[i];
dp[i][j][1] = list[i];
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
dp[i][j][0] = dp[i][j - 1][0] + list[j];
dp[i][j][1] = dp[i][j - 1][1] * list[j];
}
}
int ans = n;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
if (dp[i][j][0] == dp[i][j][1]) {
ans++;
}
}
}
// for (int i = 1; i <= n; i++) {
// for (int j = 1; j <=n; j++) {
// System.out.print("("+dp[i][j][0]+" "+dp[i][j][1]+")");
// }
// System.out.println();
// }
System.out.println(ans);
}
}
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
小蓝很喜欢吃巧克力,他每天都要吃一块巧克力。
一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力,每种巧克力有自己的价格、数量和剩余的保质期天数,小蓝只吃没过保质期的巧克力,请问小蓝最少花多少钱能买到让自己吃 x 天的巧克力。
【输入格式】
输入的第一行包含两个整数 x, n,分别表示需要吃巧克力的天数和巧克力的种类数。
接下来 n 行描述货架上的巧克力,其中第 i 行包含三个整数 ai , bi , ci,表示第 i 种巧克力的单价为 ai,保质期还剩 bi 天(从现在开始的 bi 天可以吃),数量为 ci。
【输出格式】
输出一个整数表示小蓝的最小花费。如果不存在让小蓝吃 x 天的购买方案,输出 −1。
【样例输入】
10 3
1 6 5
2 7 3
3 10 10【样例输出】
18
【样例说明】
一种最佳的方案是第 1 种买 5 块,第 2 种买 2 块,第 3 种买 3 块。前 5 天吃第 1 种,第 6、7 天吃第 2 种,第 8 至 10 天吃第 3 种。
【评测用例规模与约定】
对于 30% 的评测用例,n, x ≤ 1000。
对于所有评测用例,1 ≤ n, x ≤ 100000,1 ≤ ai , bi , ci ≤ 109。
暂无!
时间限制: 10.0s 内存限制: 768.0MB 本题总分:25 分
【问题描述】
给定一个长度为 n 的括号序列,要求支持两种操作:
1. 将 [Li , Ri ] 区间内(序列中的第 Li 个字符到第 Ri 个字符)的括号全部翻转(左括号变成右括号,右括号变成左括号)。
2. 求出以 Li 为左端点时,最长的合法括号序列对应的 Ri (即找出最大的 Ri 使 [Li , Ri ] 是一个合法括号序列)。
【输入格式】
输入的第一行包含两个整数 n, m,分别表示括号序列长度和操作次数。
第二行包含给定的括号序列,括号序列中只包含左括号和右括号。
接下来 m 行,每行描述一个操作。如果该行为 “1 Li Ri”,表示第一种操作,区间为 [Li , Ri ] ;如果该行为 “2 Li” 表示第二种操作,左端点为 Li。
【输出格式】
对于每个第二种操作,输出一行,表示对应的 Ri。如果不存在这样的 Ri,请输出 0。
【样例输入】
7 5
((())()
2 3
2 2
1 3 5
2 3
2 1【样例输出】
4
7
0
0【评测用例规模与约定】
对于 20% 的评测用例,n, m ≤ 5000;
对于 40% 的评测用例,n, m ≤ 30000;
对于 60% 的评测用例,n, m ≤ 100000;
对于所有评测用例,1 ≤ n ≤ 10^6 , 1 ≤ m ≤ 2 × 10^5。
暂无!
时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分
【问题描述】
给定 T 个数 n1, n2, · · · , nT,对每个 ni 请求出有多少组 a, b, c 满足:
1. 1 ≤ a, b, c ≤ ni;
2. a ⊕ b ⊕ c = 0,其中 ⊕ 表示二进制按位异或;
3. 长度为 a, b, c 的三条边能组成一个三角形。
【输入格式】
输入的第一行包含一个整数 T。
接下来 T 行每行一个整数,分别表示 n1, n2, · · · , nT。
【输出格式】
输出 T 行,每行包含一个整数,表示对应的答案。
【样例输入】
2
6
114514【样例输出】
6
11223848130【评测用例规模与约定】
对于 10% 的评测用例,T = 1, 1 ≤ ni ≤ 200;
对于 20% 的评测用例,T = 1, 1 ≤ ni ≤ 2000;
对于 50% 的评测用例,T = 1, 1 ≤ ni ≤ 2^20;
对于 60% 的评测用例,1 ≤ T ≤ 100000, 1 ≤ ni ≤ 2^20;
对于所有评测用例,1 ≤ T ≤ 100000, 1 ≤ ni ≤ 2^30。
暂无!