2021年 第12届 蓝桥杯 Java B组 决赛真题详解及小结【2021.06.05】

2021年 第12届 蓝桥杯 Java B组 决赛真题详解及小结【2021.06.05】,第1张

2021年 第12届 蓝桥杯 Java B组 决赛真题详解及小结【2021.06.05】

  • 蓝桥杯 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

    仅供参考,欢迎指正!部分为个人想法和解题思路,如有错误或不足,欢迎指正。

      

    一、试题A:整数范围(本题总分:5 分)

    本题总分:5 分

    【问题描述】

    用 8 位二进制(一个字节)来表示一个非负整数,表示的最小值是 0,则一般能表示的最大值是多少?

    【答案提交】

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

    【答案】:255

    01解法一

    二进制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
    	}
    }
    二、试题B:纯质数(本题总分:5 分)

    本题总分: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

    02解法一

    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);
    	}
    }
    三、试题C:完全日期(本题总分:10 分)

    本题总分: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

    03解法一

    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);
    	}
    }
    四、试题D:最小权值(本题总分:10 分)

    本题总分: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 个结点的二叉树,树的权值最小可能是多少?

    【答案提交】

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

    【答案】:暂无!

    04解法一

    暂无!

    五、试题E:大写(时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分)

    时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分

    【问题描述】给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母 转换成大写字母后将字符串输出。

    【输入格式】输入一行包含一个字符串。

    【输出格式】输出转换成大写后的字符串。

    【样例输入 1】LanQiao

    【样例输出 1】LANQIAO

    【评测用例规模与约定】对于所有评测用例,字符串的长度不超过 100。

    05解法一

    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);
    	}
    }
    六、试题F:123(时间限制: 5.0s 内存限制: 512.0MB 本题总分:15 分)

    时间限制: 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。

    06解法一

    暂无!

    七、试题G:和与乘积(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)

    时间限制: 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。

    07解法一
    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);
    	}
    }
    八、试题H:巧克力(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)

    时间限制: 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。

    08解法一

    暂无!

    九、试题I:翻转括号序列(时间限制: 10.0s 内存限制: 768.0MB 本题总分:25 分)

    时间限制: 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。

    09解法一

    暂无!

    十、试题J:异或三角(时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分)

    时间限制: 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。

    10解法一

    暂无!

    小结

     

    欢迎分享,转载请注明来源:内存溢出

    原文地址: https://outofmemory.cn/zaji/5719514.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-12-18
    下一篇 2022-12-17

    发表评论

    登录后才能评论

    评论列表(0条)

    保存