文章目录

  • 2021 第十二届 Java B组 国赛 真题答案 详细解析
    • 试题A: 整数范围
    • 答案:255
      • 分析:
      • Code:
    • 试题B: 纯质数
    • 答案:1903
    • 分析:
    • Code:
    • 试题C: 完全日期
    • 答案:977
      • 分析:
      • Code:
    • 试题D: 最小权值
    • 答案:
      • 分析:现场的时候不会做
      • Code:
    • 试题E: 大写
      • 分析:
      • Code:
    • 试题F: 123
      • 分析:
      • Code:
    • 试题G: 和与乘积
      • 分析:
      •  比赛时的思路
      •  下面是正解分析:point_down:
      • Code:
    • 试题H: 巧克力
      • 分析:
      • Code:
    • 试题I: 翻转括号序列
      • 分析:
      • Code:
    • 试题J: 异或三角
      • 分析:
      • Code:

2021 第十二届 Java B组 国赛 真题答案 详细解析


结果出来了,国三,考前准备的时间还是太少了 就考前四五天刷了一些往年的题,前面的时间在写别的项目
该死,最后那道题我应该暴搜混分的,可惜当时样例输出一下就走了
哎,蓝桥杯不能看到每道题的答题情况,我都不知道我那两道超了内存限制的题最后是怎么样了,是直接没分了还是?
本人大一,明年再好好准备再参加一次吧


试题A: 整数范围

本题总分:5 分
【问题描述】

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

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

答案:255

分析:

  签到题,二进制00000000为十进制的0,11111111自然为十进制的255。

Code:

  无


试题B: 纯质数

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

分析:

  先找出1~20210605中所有的质数(可以先打表),然后再遍历所有找出的质数,判断是不是纯质数。至于如何判断某个质数n是不是纯质数,这里如果自己手动去把该质数n的每一位取出来会比较麻烦,所以用java自带的类来快速实现:将该质数n用String.value(int value)转换为字符串,然后用for遍历这个字符串中每一个字符,再用Integer.value(String value)将该字符转化为数字,再单独判断每个这个数字是不是质数就行,记得1,和0不是质数要排除掉。
(虽然这样暴搜运行效率底,但是实现快,填空题嘛。把上限调到较小的值测试测试耗时之后,觉得还行,无非就几分钟,这几分钟我先去看别的题目,回来之后就有结果了,实在不行,骚微优化一下也行,不过现场还没优化就出来了,码字不易,要一个赞不过分吧)

Code:

比赛时现场敲的原代码,后面有时间再写优化版的
这里先打上注释

import java.util.ArrayList;
public class Main {static int number=20210605;//测试的上限static int map[]=new int[number];static ArrayList<String> 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和0if(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+"  ");}//如果这个质数是纯质数的话,总和+1if(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 分
【问题描述】

  如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。
  例如: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

分析:

  这个题和上个题一样,直接上java自带的日期类Data和Calendar,总比现场自己实现来的快。所以如果蓝桥杯报的是java的话,一定要多了解这些日期,时间,集合等这些自带类的基本使用。就像你报C/C++一定要会用STL一样。说不定就用上了,用上了直接就爽歪了(手动滑稽),而且比赛有提供api手册的,不用白不用。要知道2001.01.01~2021.12.31有多少个完全日期的话需要把所有日期都遍历一遍,如果你自己实现的话,那你必须把每一天都遍历到,不能多了不能少了,即你需要对大小月进行判断,比如2月28天的,也有29天的,其他月份有30天的,也有31天的。当你把这些判断清楚后已经花费很多时间了。所有还是用java自带的类来得快。(其实最主要的是我判断润不闰年的那个条件记不太清楚了,是什么什么400的整倍?还是怎么招,不太确定,所以当时就想着用java自带的类库稳妥一点)
  首先是获取到日期指定为2001.01.01的Data类的对象data,然后再将此对象data转换为Calendar类的对象calendar,为什么要转换为Calendar类的对象呢,以为Data类没有提过具体的日期的增加,减少的方法(即在原日期上增加一个年,月,天,小时,秒等)。Calendar类有提供这些方法,利用其提供的:在原日期上增加一天的方法 ,我们就可以很快的实现对2001.01.01~2021.12.31中的每一天进行遍历,而且什么大小月,闰年非闰年,java官方已经帮我们解决好了,你说它不香吗。在遍历的时候我们可以调用对象calendar的gei(int filed)方法,快速拿到每一天的号数,月数,年份。但是这里有个坑,就是通过此方法拿到的数值是和对象calendar调用toString后看到的字符串上的日期是有差距的(比如每个月1号本来获取到的数值应该是1,而实际情况却是0等不一致的情况)。而且转换还不是很方便。试了两边后现场的我果断从calendar的toString中获取数值(即在calendar调用toString后得到的字符串中截取数值),这样就避免了刚刚提到了那个不一致的情况。
  拿到数值后就很快了,累加一下判断一下是不是完全平方数就行了。这一步我也是利用了java自带的类来快速实现。(即把几个可能的完全平方数加到ArrayList数组里面,然后调用contains方法就可以知道某个数是不是完全平方数了)

Code:

比赛时现场敲的原代码,后面有时间再写优化版的
这里先打上注释

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;public class Main {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<Integer> 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);//是的话计数器+1if(contains==true) {//                System.out.println("  "+sum);anscount++;}
//          }calendar.add(Calendar.DAY_OF_MONTH, 1);}System.out.println(anscount);}
}

推荐几本书

这几本都是入门算法非常经典的书,可以看看,也可以当工具书


下载链接:

https://gitee.com/Tptogiar/cs-book

试题D: 最小权值

本题总分:10 分
【问题描述】

  对于一棵有根二叉树T,小蓝定义这棵树中结点的权值W(T)如下:
  空子树的权值为0。
  如果一个结点v有左子树L,右子树R,分别有C(L)和C®个结点,则:
    W(v) = 1 + 2W(L) + 3W® +(C(L))2C®。
  树的权值定义为树的根结点的权值。
  小蓝想知道,对于一棵有2021个结点的二叉树,树的权值最小可能是多少?

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

答案:

分析:现场的时候不会做

  考前在写一个局域网的聊天工具,后面又写了一个安卓仿微信的界面,快考时一整晚一整晚的打cs:go

所以数据结构什么的,树什么的只是了解过,但是没有实战过。所以看见这道题直接跳了
动态规划的题也刷的少,大概写过的动归只有3,4道吧。所以考前一晚上慌得一匹,找了一些动归的资料,学了一些。比赛的时候真久用上了,不过用的不太对(下面试题G: 和与乘积 )

Code:

  


试题E: 大写

时间限制: 1.0s  内存限制: 512.0MB  本题总分:15分
【问题描述】

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

【输入格式】
输入一行包含一个字符串
【输出格式】
输出转换成大写后的字符串。
【样例输入1】
LanQiao
【样例输出1】
LANQIAO
【评测用例规模与约定】
对于所有评测用例,字符串的长度不超过100。

分析:

  签到题,用什么都快,但是用java中String自带的大小写转换函数更快,不到30s,新的java文件刚建完就写完了。不过也是简单,我越容易犯错误,题目重新看了几遍,代码测试了几遍我才敢交。

Code:

比赛时现场敲的原代码

import java.util.Scanner;
public class Main {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分
【问题描述】

  小蓝发现了一个有趣的数列,这个数列的前几项如下:
    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
【评测用例规模与约定】

分析:

  用规律去算了,可以过前面的数据

Code:

比赛时现场敲的原代码,后面有时间再写优化版的
这里先打上注释


试题G: 和与乘积

时间限制: 1.0s   内存限制: 512.0MB   本题总分:20分
【问题描述】

给定一个数列A= (a1{a_{1}}a1​,a2{a_{2}}a2​,…,an{a_{n}}an​)
问有多少个区间[L,R]满足区间内元素的乘积等于他们的和,即aL{a_{L}}aL​ * aL+1{a_{L+1}}aL+1​ * …*aR{a_{R}}aR​=aL{a_{L}}aL​+aL+1{a_{L+1}}aL+1​+…+aR{a_{R}}aR​。

【输入格式】
输入第一行包含一个整数n,表示数列的长度。第二行包含n个整数,依次表示数列中的数a1{a_{1}}a1​,a2{a_{2}}a2​,…,an{a_{n}}an​。
【输出格式】
输出仅一行,包含一个整数表示满足如上条件的区间的个数。
【样例输入】
4
1 3 2 2
【样例输出】
6
【样例解释】
符合条件的区间为[1,1],[1,3],[2,2],[3,3],[3,4],[4,4]。
【评测用例规模与约定】

分析:
 比赛时的思路

  题目要求找出所有满足要求的子区间,可以找出所有区间,然后看着每个区间是否满足题意。

那如何找出所有区间呢?如果用传统的递归遍历或是循环遍历,那无疑复杂度会很高。所以我想到的就是用动态规划。

例如:
对于一个{1,3,2,2}这个集合,它的所有子区间无非就是[1,1],[1,2],[1,3],[1,4],[2,2],[2,3],[2,4],[3,3],[3,4],[4,4]。如果把它画在一个4*4的矩阵中那就是取矩阵的上上三角(即主对角线往上那部分,下面示意图中有具体值填充的非空的区域)。

那如何进行累加累乘的计算?如果每一个区间的累加值和累乘值都从头计算一遍那样复杂度也会很高。所以需要运用递推的思想(这种思想还是挺有用的,类似于分治思想,把问题分解为多个子问题再逐一计算,且计算的数据源来自于上一次计算的结果)。运用递推将上一次结算的结果作为本次计算的数据源,这样复杂度就降下来了。

具体操作上:
开一个dp数组,即dp[count][count][2]。其中dp的第三维为[2],其第一个[0]用来存放累加的值,第二个[1]用来存放累乘的积。即dp[i][j][0]表示从第i行的第i个累计加到该行第j个的值,dp[i][j][1]表示从第i行的第i个累乘到该行第j个的值

状态转移方程为:

(1)dp[i][j][0]=dp[i][j-1][0]+list[j]
(表示第i行的第j个的累加值等于该行上一列的累加值加上该列本身的值)

(2)dp[i][j][1]=dp[i][j-1][1] * list[j]
(表示第i行的第j列的累乘值等于该行上一列的累乘值乘上该列本身的值)

最后在根据计算过的结果遍历一遍看有那些是符合题意的就可以了
下面是示意图(红色的为累加的值等于累乘的值,即题目所求)

做图不易,正在看图的彭于晏CSDN分晏会留下一个赞的吧。

考前刷的题少,刚好考前一晚看了一些动规中最长公共子序列相关的资料。了解到了那种思想。所以看到这道题,我第一反应就是动规动规动规~动动规,可惜这道题动归不是正解

2021 第十二届 蓝桥杯 国赛决赛 Java B组 真题 详细解析相关推荐

  1. 2021第十二届蓝桥杯国赛总结-java大学c组

    比赛结果 结果挺意外的,比赛中失误较多,送分题暴毙(审题失误),没把自己气死,结果算不错,但也挺可惜. 解答过程 1. 整数范围 答案:255 没想太多直接计算器算的,后来听符号位,但似乎不用考虑. ...

  2. 2021第十二届蓝桥杯省赛一等奖Java B组总结

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 省赛成绩出来了,省赛一等奖 国赛地点出来 ...

  3. 16行代码AC_【第十届蓝桥杯省赛c/c++B组真题解析】7.完全二叉树的权值

    励志用更少的代码做更高效的表达 给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下.从左到右的顺序依次是 A1, A2, · · · AN,如下图所示 现在小明要把相同深度的 ...

  4. 第十二届蓝桥杯省赛C/C++B组2021

    第十二届蓝桥杯省赛C/C++B组2021 A:空间(5分) 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 小蓝准备用 256MB256MB 的内存空间开一个数组,数组的每个 ...

  5. 2021第十二届蓝桥杯省赛JAVA B组 题目+答案(复现赛)

    2021第十二届蓝桥杯省赛JAVA B组 题目+答案(复现赛) A:ASC B:卡片 C:直线 D:货物摆放 E:路径 Floyed Dijkstra F:时间显示 G:最少砝码 H:杨辉三角形 I: ...

  6. 2021第十二届蓝桥杯省赛B组C/C++ 试题 E: 路径

    2021第十二届蓝桥杯省赛B组C/C++ 试题 E: 路径 代码 试题 E: 路径 Ans=10266837 我哭了 最短路径的题考前刷了多少道,最后还是在考场翻车 还是太菜啊啊.. 首先是边权图的初 ...

  7. 2020十一届蓝桥杯国赛二等奖Java B组

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 参考博客https://blo ...

  8. 2021年第十二届蓝桥杯省赛C/C++B组题解总结

    前几天(2021.4.18)刚刚比完了2021年第十二届蓝桥杯省赛,本人参加的是软件组C++B组的比赛,本文包括了这一届C++B组的题目以及部分题解.感悟和总结. 目录 试题A.空间 试题B.卡片 试 ...

  9. 第十二届蓝桥杯国赛真题+题解 Python

    文章目录 写在前面 试题A:带宽 试题 B: 纯质数 试题C: 完全日期 试题D: 最小权值 试题 E: 大写 试题 F: 123 试题 G: 冰山 试题 H: 和与乘积 试题 I: 二进制问题 试题 ...

最新文章

  1. C++中为什么要引入抽象基类和纯虚函数?
  2. Python学习笔记__1.5章 循环
  3. OpenShift 与 OpenStack:让云变得更简单
  4. jquery在选择器中使用变量及innerText问题(转载)
  5. RabbitMQ集群故障恢复详解
  6. 安装vue cli_vuecli4.x安装与搭建
  7. [译]介绍Spark2.4的用于处理复杂数据类型的新内置函数与高阶函数
  8. AD09 PCB制作开异性窗口
  9. 2016计算机奥林匹克小学,NOIP2016复赛数据
  10. css 实现一个尖角_css3如何做尖角标签效果?
  11. python找零_python 找零问题 动态规划
  12. 如何录制音频文件mp3?给你推荐好用的几款音频录制软件
  13. linux dpkg: 错误: 无法打开软件包的 info 文件 /var/lib/dpkg/available 以便读取: 没有那个文件或目录
  14. outer和left outer join有什么区别
  15. 【杂谈】win10耳机与外放分别设置
  16. 匈牙利算法的Java语言实现
  17. 来自同济子豪兄的无私分享-关于YOLOv1模型的学习(一)
  18. 想给他打领带吗?(图)
  19. 当音乐学博士搞起编程,用一本书改变了Java世界!
  20. UG软件中针对汽车产品开发的模块

热门文章

  1. 如何利用Web of Science进行科学研究
  2. 服务器pe装系统找不到硬盘,用U盘PE装系统找不到硬盘如何解决妙招
  3. SAP UI5 进阶 - XML 视图里定义的 UI 控件,运行时实例化的技术细节剖析试读版
  4. 哪款蓝牙耳机跑步好用?跑步好用的耳机推荐
  5. 文献综述在哪儿能找到?
  6. 《测量助理》最新版本V3.0.220618发布更新
  7. 苹果cms漫画小说模板
  8. 基于51单片机+ULN2003控制步进电机S曲线加减速
  9. 导数求函数最大值和最小值习题
  10. 【生存游戏】一组按序排列围成一圈的参赛选手,通过逢3退1游戏机制筛选出最后一个生存者的Java算法