小言_互联网的博客

2021第十二届蓝桥杯省赛Java B组总结

484人阅读  评论(0)

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



首先,今年就是一个混子!啥都不会,纯暴力!
今年就是 骗分,投机取巧小达人!

A ascii

求L的ascii码
直接掰手指头数都行!混子!

B 卡片

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。
小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1拼到多少?
提示:建议使用计算机编程解决问题。

分析

构造数组a[10]分别代表0到9的数字卡片个数,枚举一个数字的每个位数,用掉一个位数就减掉一张卡片,如果当卡片数量小于零,则说明卡片数量不够,即无法表示卡片,直接输出并退出!

答案

3181

C 直线

在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。
给定平面上 2 × 3 个整点 {(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z},即横坐标是 0 到 1 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数的点。这些点一共确定了 11 条不同的直线。
给定平面上 20 × 21 个整点 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z},即横坐标是 0 到 19 (包含 0 和 19) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20) 之间的整数的点。请问这些点一共确定了多少条不同的直线。

分析

我把它认为是一个求不同曲线问题,所以就是要确定直线y=kx+by-y1=(y2-y1)/(x2-x1)(x-x1),然后将曲线存进集合set中去重即可,但由于相除的过程中可能导致相同的比例,但精度损失,所以最好不使用除法。
我自己使用(x2-x1)y=(y2-y1)x-x1(x2-x1)+(x2-x1)y1,但是出现了一个问题:
2y=2x-2y=-2xy=x其实是相同方程的,所以我们应该把系数化简后再存进去集合中
另外,我个人习惯把特殊情况,即直线x=ky=k这种情况单独讨论,从而减少问题复杂情况

答案

40257

D 货物摆放

小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的立方体。即在长、宽、高的方向上分别堆 L、W、H 的货物,满足 n = L × W × H。
给定 n,请问有多少种堆放货物的方案满足要求。
例如,当 n = 4 时,有以下 6 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 1。
请问,当 n = 2021041820210418 (注意有 16 位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。

分析

刚开始没理解题意,到后来想用暴力跑了骗分,结果跑了十几分钟还没跑出来就放弃了

E 路径

小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。
小蓝的图由 2021 个结点组成,依次编号 1 至 2021。
对于两个不同的结点 a, b,如果 a 和 b 的差的绝对值大于 21,则两个结点之间没有边相连;如果 a 和 b 的差的绝对值小于等于 21,则两个点之间有一条长度为 a 和 b 的最小公倍数的无向边相连。
例如:结点 1 和结点 23 之间没有边相连;结点 3 和结点 24 之间有一条无向边,长度为 24;结点 15 和结点 25 之间有一条无向边,长度为 75。
请计算,结点 1 和结点 2021 之间的最短路径长度是多少。
提示:建议使用计算机编程解决问题。

分析

很显然的迪杰斯特拉算法,但是,谁会再考场上手写这么麻烦的算法
很显然这是一道填空题,没必要使用迪杰斯特拉,直接使用floyd就好了,三个for循环,5行代码,要什么自行车?

  1. 建边,由于是裸考,太久没复习算法,gcd算法都忘了怎么写,想了很久实在是写不出了,怎么办?想起来Java有BigInteger类,类里自带gcd算法,直接调用就完事了!反正是填空题
  2. 按照题目建完边直接用Floyd算法即可
  3. 直接输出map[1][2021]即可

答案

忘了,思路应该没问题

F 时间显示

小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
【输入格式】
输入一行包含一个整数,表示时间。
【输出格式】
输出时分秒表示的当前时间,格式形如 HH:MM:SS,其中 HH 表示时,值
为 0 到 23,MM 表示分,值为 0 到 59,SS 表示秒,值为 0 到 59。时、分、秒
不足两位时补前导 0。
【样例输入 1】
46800999
【样例输出 1】
13:00:00
【样例输入 2】
1618708103123
【样例输出 2】
01:08:23
【评测用例规模与约定】
对于所有评测用例,给定的时间为不超过 10^18 的正整数。

分析

笑死,脑海中一直以为一秒等于60毫秒,后来怎么着也与答案不符,所以猜想是不是1000毫秒,答案都对的上,需要注意的细节是

  1. 刚开始应先将数据除以1000(一秒=1000毫秒)
  2. 将数据%246060,只要时间不要日期
  3. 不足两位数的数输出时应该在前面补零

G 砝码称重

分析

H 杨辉三角形

下面的图形是著名的杨辉三角形:
如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:
1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, …
给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?
杨辉三角形

【输入格式】
输入一个整数 N。
【输出格式】
输出一个整数代表答案。
【样例输入】
6
【样例输出】
13
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ N ≤ 10;
对于所有评测用例,1 ≤ N ≤ 1000000000。

分析

考场上想不出能直接算出该结果的值,所以借助杨辉三角形的排列规则:组合数Ck n n n然后从上往下每一层找是否存在有一个数使得等式N=Ck n n n成立,此时k、n即可唯一确定N首次出现的位置
层数时以1为首项,1为公差的等差数列,很容易求总个数和,再加上第n层的的第k个数,即为首次出现的位置。

I 双向排序

给定序列 (a1, a2, · · · , an) = (1, 2, · · · , n),即 ai = i。
小蓝将对这个序列进行 m 次操作,每次可能是将 a1, a2, · · · , aqi 降序排列,或者将 aqi, aqi+1, · · · , an 升序排列。
请求出操作完成后的序列。
【输入格式】
输入的第一行包含两个整数 n, m,分别表示序列的长度和操作次数。接下来 m 行描述对序列的操作,其中第 i 行包含两个整数 pi
, qi 表示操作类型和参数。当 pi = 0 时,表示将 a1, a2, · · · , aqi 降序排列;当 pi = 1 时,表示
将 aqi, aqi+1, · · · , an 升序排列。
【输出格式】
输出一行,包含 n 个整数,相邻的整数之间使用一个空格分隔,表示操作
完成后的序列。
【样例输入】
3 3
0 3
1 2
0 2
【样例输出】
3 1 2
【样例说明】
原数列为 (1, 2, 3)。
第 1 步后为 (3, 2, 1)。
第 2 步后为 (3, 1, 2)。
第 3 步后为 (3, 1, 2)。与第 2 步操作后相同,因为前两个数已经是降序了。
【评测用例规模与约定】
对于 30% 的评测用例,n, m ≤ 1000;
对于 60% 的评测用例,n, m ≤ 5000;
对于所有评测用例,1 ≤ n, m ≤ 100000,0 ≤ ai ≤ 1,1 ≤ bi ≤ n。

分析

没啥思路,直接调用Java的Arrays.sort(array,1,n+1,increaseCompator);Arrays.sort(array,1,n+1,decreaseCompator);来暴力骗分,总比没分好,其中increaseCompator、decreaseCompator是自己实现的比较器。

J 括号序列

给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合法,当添加完成后,会产生不同的添加结果,请问有多少种本质不同的添加结果。两个结果是本质不同的是指存在某个位置一个结果是左括号,而另一个是右括
号。
例如,对于括号序列 (((),只需要添加两个括号就能让其合法,有以下几种不同的添加结果:()()()、()(())、(())()、(()()) 和 ((()))。
【输入格式】
输入一行包含一个字符串 s,表示给定的括号序列,序列中只有左括号和
右括号。
【输出格式】
输出一个整数表示答案,答案可能很大,请输出答案除以 1000000007 (即
10^9 + 7) 的余数。
【样例输入】
((()
【样例输出】
5
【评测用例规模与约定】
对于 40% 的评测用例,|s| ≤ 200。
对于所有评测用例,1 ≤ |s| ≤ 5000。

分析

考场上发现没时间写这一道了,但是看情况会有两种特殊情况

  1. 当左括号数量全为零或右括号数量全为零,那么此时是个卡特兰数(考场上卡特兰数公式忘关了)不然还能继续骗点分
  2. 左括号和右括号数量相等,那么就不用再插入括号(应该能骗点分)

总结

太久没碰代码,很多东西确实忘了。能写的出就觉得还行了,不过!三百块钱拿来吃烤肉不香吗!!!


2020年4月18日更

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



转载:https://blog.csdn.net/CrazyMooo/article/details/115840180
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场