导航菜单
首页 >  蓝桥杯历年真题解析Java大学A组  > 2021 第十二届蓝桥杯 Java 省赛 B 组(第一场)真题解析

2021 第十二届蓝桥杯 Java 省赛 B 组(第一场)真题解析

没想到一年前的文章还是有挺多同学来看的,这里统一回复一下吧。🤣 这篇题解有好几道大题代码不对或者没写,想知道怎么做的请移步 这里。 去年没做对几道题,本以为寄了,结果挺意外的,还是进了国赛,然而自己还是太菜了,想冲国二但遗憾国三退场。 相冲国二及以上的同学,动态规划不说遇到就完全会做吧,至少要达到大部分常见的 DP 套路能信手捏来,才算稳,也就是说国赛出的 DP 题如果能做出来,国二基本稳了。 接着说说省赛吧,B 组省一以下会做模拟和语言的各种 API 就差不多了,几乎不需要什么算法能力。但考虑到难度逐年上涨,我就定个标准吧,DFS / BFS 爆搜会做的程度,稳定省二以上。 想要寻求系统学习的同学,推荐去 AcWing 跟着闫老师(上面的题解视频就是他,NOI 金牌爷保送北大,yls yyds!)学,如果想系统学习基础算法,推荐购买「算法基础课」,想突击奖项且激励自己学习的(按拿奖程度返现,相当于拿奖后就是白嫖课程),买「蓝桥杯辅导课」。 最后,CSDN 大概率是不会更新了(懒,加上去年的广告贴脸事件,yue 了)。 这是我的 AcWing 主页,欢迎关注!😀

A. ASC(5分)

已知大写字母 A 的 ASCII 码为 65,请问大写字母 L 的 ASCII 码是多少?

答案:76代码

点击就送。直接输出字母对应的 int 值即可。

public class Main {public static void main(String[] args) {// 76System.out.println((int)'A' + " " + (int)'L');}}B. 卡片(5分)

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。

小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。

小蓝想知道自己能从 1 拼到多少。

例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。

现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少?

答案:3181代码

哭了😭,这题白给。开始时读了好几遍读不懂,放着最后一刻钟再看,突然就看懂了:

当时还在想不是 11 = 8 + 3 or 9 + 2 吗,怎么和 1 杠上了呢;

后面才发现使用单个数字作为数位来拼,换句话说,11 是用两个 1 拼出来的…

也就是说这一堆卡片消耗到哪个数字时不能拼出来,我们就输出这个数字的前一个数字!!!

题目给的例子是要我们输出 10,好家伙,当时状态也不太好了,脑子里满是 11 ,程序跑出了 11 后改成 2021 ,得到结果 3182,我直接就交了😭😭😭!!!

思路是哈希。

import java.util.Arrays;public class Main {public static void main(String[] args) {int[] hash = new int[10];Arrays.fill(hash, 2021);long num = 0;boolean flag;do {num++;flag = true;char[] str = String.valueOf(num).toCharArray();for (char bit : str) {if (hash[bit - '0'] > 0) {hash[bit - '0']--;} else {flag = false;break;}}} while (flag);System.out.println(num - 1); // 3181 我吐了,大家一定要仔细读题}}C. 直线(10分)

在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。

给定平面上 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) 之 间的整数的点。请问这些点一共确定了多少条不同的直线。

答案: 41300(精度爆炸,错误) 40239 (K 不存在时,不应该在 B 哪儿处理) 正解是 40257。代码

这道题我…拿到手就会做!

不太想做其实… 感觉自己写的精度炸裂

思路是先获得所有的点,再根据两两不同的点去计算直线,用的斜截式 y = kx + b。

然后得到所有的 k 和 b,并去重,问题就出在了 b 是浮点数,精度警告!

其实为了保险,可以把 b 也像 k 当最简分数算出来的,哎,懒。

过不过看运气吧~😪

======= 21 - 04 - 19 update =======

Guess what?这一题我也白给啦!!!好耶!!!

果然是精度爆炸,我就不该玩 double…

算了,这就叫 no zuo no die(摊手

import java.util.List;import java.util.ArrayList;import java.util.HashSet;import java.util.Set;public class Main {static Set ans = new HashSet();public static int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);}//最初的 b 用 double 记录 —— 精度爆炸//public static void getKB(int a, int b) {//int x1 = a / 100, x2 = b / 100;//int y1 = a % 100, y2 = b % 100;////int up = y1 - y2, down = x1 - x2;//int div = gcd(up, down);//String K = (up / div) + " " + (down / div);//double B = x1 * 1.0f;//if (down != 0) {//double k = up * 1.0 / down;//B = y1 - k * x1;//}//ans.add(K + " " + B);//}//好家伙,又写错一次!细心啊细心啊细心啊细心啊细心啊!!!//public static void getKB(int a, int b) {//int x1 = a / 100, x2 = b / 100;//int y1 = a % 100, y2 = b % 100;////// 计算 k 的最简分数//int up = y1 - y2, down = x1 - x2;//int div_k = gcd(up, down);//String K = (up / div_k) + " " + (down / div_k);////// 计算 kx 和 y 的分子//int up_kx = up * x1, up_y = y1 * down;////// 计算 b = y - kx 的最简分数//int up_b = up_y - up_kx;//int div_b = gcd(up_b, down);//// 除零处理//String B = div_b == 0 ? up_b + "/0 " + down + "/0" ://(up_b / div_b) + " " + (down / div_b);//ans.add(K + " " + B);//}// String yyds!!! 不能再错了吧?public static void getKB(int a, int b) {int x1 = a / 100, x2 = b / 100;int y1 = a % 100, y2 = b % 100;// 计算 k 的最简分数int up = y1 - y2, down = x1 - x2;int div_k = gcd(up, down);String K = (up / div_k) + " " + (down / div_k);// 特判 k 不存在,即 down = 0 的情况// 此时方程为 x = x1 or x2;if (down == 0) {ans.add("x = " + x1);return;}// 代入点 (x1, y1) 来计算 kx 和 y 的分数// 因为分母都是 down,所以只求分子就好int up_kx = up * x1, up_y = y1 * down;// 计算 b = y - kx 的最简分数int up_b = up_y - up_kx;int div_b = gcd(up_b, down);String B = (up_b / div_b) + " " + (down / div_b);// 加入答案ans.add(K + " " + B);}public static void main(String[] args) {Set set = new HashSet();int x = 19, y = 20;for (int i = 0; i

相关推荐: