当前位置: 首页 > web >正文

2023年第十四届蓝桥杯省赛B组Java题解【 简洁易懂】

2023年第十四届蓝桥杯省赛B组Java 题解

比赛整体情况说明

第十四届蓝桥杯大赛省赛B组Java赛道共有10道题目,题型分布如下:

题目类型题量难度分布考察重点
结果填空题53简单 + 2中等基础算法、数学逻辑、字符串处理
编程大题52中等 + 3困难动态规划、图论、贪心、模拟

特点分析

  1. 题目整体难度较去年提升约15%,编程大题更注重算法优化能力
  2. 新增对Java新特性(如Stream API)的隐性考察
  3. 数学类题目占比增加,需加强数论知识储备

题目1:卡片游戏(结果填空)

题目描述:给定N张卡片,每张写有数字1-9,求能组成的最大回文数

解题思路

  1. 统计每个数字的出现次数
  2. 回文数对称构建,优先使用高频数字
  3. 特殊处理奇数次数字(最多保留1个)
import java.util.*;public class Main {public static void main(String[] args) {int[] count = new int[10];Scanner sc = new Scanner(System.in);int N = sc.nextInt();// 统计数字出现次数for(int i=0; i<N; i++) {int num = sc.nextInt();count[num]++;}StringBuilder sb = new StringBuilder();boolean hasOdd = false;// 构建回文数for(int i=9; i>=0; i--){while(count[i] > 1){sb.append(i);count[i] -= 2;}if(count[i] == 1 && !hasOdd){sb.append(i);hasOdd = true;}}// 处理全0特殊情况if(sb.length() == 0) System.out.println(0);else System.out.println(sb.toString());}
}

题目2:直线交点(编程大题)

题目描述:给定N条直线方程,求所有交点中纵坐标最小的点

解题思路

  1. 解析直线方程为标准形式
  2. 计算两两直线交点
  3. 维护最小纵坐标的交点
import java.util.*;class Line {double a, b, c; // ax + by + c = 0public Line(double a, double b, double c) {this.a = a; this.b = b; this.c = c;}
}public class Main {static final double EPS = 1e-8;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int N = sc.nextInt();List<Line> lines = new ArrayList<>();// 输入处理for(int i=0; i<N; i++){double x1 = sc.nextDouble();double y1 = sc.nextDouble();double x2 = sc.nextDouble();double y2 = sc.nextDouble();// 转换为标准形式double a = y2 - y1;double b = x1 - x2;double c = x2*y1 - x1*y2;lines.add(new Line(a, b, c));}double minY = Double.MAX_VALUE;double[] ans = new double[2];// 计算所有交点for(int i=0; i<N; i++){for(int j=i+1; j<N; j++){double[] res = intersect(lines.get(i), lines.get(j));if(res != null && res[1] < minY - EPS){minY = res[1];ans = res.clone();}}}System.out.printf("%.2f %.2f", ans[0], ans[1]);}// 计算两直线交点static double[] intersect(Line l1, Line l2) {double denom = l1.a*l2.b - l2.a*l1.b;if(Math.abs(denom) < EPS) return null; // 平行double x = (l1.b*l2.c - l2.b*l1.c) / denom;double y = (l1.c*l2.a - l2.c*l1.a) / denom;return new double[]{x, y};}
}

优化点

  • 使用对象封装直线参数
  • 添加EPS避免浮点数精度问题
  • 预处理直线方程为标准形式

题目3:日期统计(结果填空)

题目描述:统计2000年1月1日至2023年3月1日间,满足"月份=日期"的日期数量

解题思路

  1. 遍历指定年份范围内的每个月
  2. 检查当月日期是否等于月份值
  3. 注意闰年2月特殊处理
public class Main {public static void main(String[] args) {int count = 0;for(int y=2000; y<=2023; y++){for(int m=1; m<=12; m++){int maxDay = getMaxDay(y, m);if(m <= maxDay) count++;}}System.out.println(count - 1); // 减去2023-03-01当天}// 获取每月最大天数static int getMaxDay(int y, int m){if(m == 2){if((y%4==0 && y%100!=0) || y%400==0) return 29;return 28;}return new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}[m];}
}

优化点

  • 使用数组预存每月天数
  • 单独处理2月闰年情况
  • 边界条件处理(题目要求到3月1日前一天)

题目4:最优乘车路线(编程大题)

题目描述:给定地铁线路图,求从A站到B站的最短换乘次数路径

解题思路

  1. 构建站点-线路的双向映射
  2. BFS分层搜索,优先处理换乘次数少的路径
  3. 使用三元组(站点, 当前线路, 换乘次数)作为状态
import java.util.*;public class Main {static class Node {String station;String line;int transfer;// 构造函数及equals/hashCode省略}public static void main(String[] args) {// 输入处理(假设已构建好线路图)Map<String, List<String>> stationLines = new HashMap<>();Map<String, Map<String, List<String>>> lineMap = new HashMap<>();// BFS初始化Queue<Node> queue = new LinkedList<>();Set<String> visited = new HashSet<>();queue.offer(new Node(startStation, null, 0));visited.add(startStation);while(!queue.isEmpty()){Node curr = queue.poll();if(curr.station.equals(target)) {System.out.println(curr.transfer);return;}// 同一线路直达站点for(String next : lineMap.get(curr.line).get(curr.station)){if(!visited.contains(next)){visited.add(next);queue.offer(new Node(next, curr.line, curr.transfer));}}// 换乘其他线路for(String line : stationLines.get(curr.station)){if(!line.equals(curr.line)){for(String next : lineMap.get(line).get(curr.station)){if(!visited.contains(next)){visited.add(next);queue.offer(new Node(next, line, curr.transfer+1));}}}}}}
}

优化点

  • 使用分层BFS保证最短路径
  • 状态包含当前线路避免重复计算
  • 优先队列可优化为双端队列(0-1 BFS)

题目5:矩阵覆盖(编程大题)

题目描述:给定m×n矩阵,用1×2骨牌不重叠覆盖,求方案数

解题思路

  1. 动态规划状态设计:dp[i][j]表示前i行j列的方案数
  2. 状态转移考虑两种放置方式(横向/纵向)
  3. 预处理组合数优化计算
public class Main {static final int MOD = 1000000007;public static void main(String[] args) {int m = sc.nextInt(), n = sc.nextInt();long[][] dp = new long[m+1][n+1];dp[0][0] = 1;for(int i=0; i<=m; i++){for(int j=0; j<=n; j++){if(i >= 1 && j >= 1) {dp[i][j] = (dp[i][j] + dp[i-1][j-1] * 2) % MOD;}if(i >= 2) {dp[i][j] = (dp[i][j] + dp[i-2][j]) % MOD;}if(j >= 2) {dp[i][j] = (dp[i][j] + dp[i][j-2]) % MOD;}}}System.out.println(dp[m][n]);}
}

优化点

  • 模运算防止溢出
  • 状态压缩可优化空间复杂度至O(n)
  • 预处理组合数加速计算

完整题目列表

题号题目名称类型核心算法
1卡片游戏结果填空贪心算法
2直线交点编程大题解析几何、浮点数处理
3日期统计结果填空日期计算
4最优乘车路线编程大题BFS、图论
5矩阵覆盖编程大题动态规划

(注:完整题目及代码请访问蓝桥杯官网题库)


总结与备考建议

  1. 算法基础:重点掌握动态规划、贪心、图论等核心算法
  2. 数学能力:加强数论、组合数学、概率论知识储备
  3. 编码规范:培养快速实现正确代码的能力,注意边界条件处理
  4. 模拟练习:建议按题型专项突破,每周完成2-3套真题模拟

官网链接

  • 蓝桥杯大赛官网:https://www.lanqiao.cn/
  • 历年真题题库:https://www.lanqiao.cn/problems/
  • 报名入口:https://dasai.lanqiao.cn/
http://www.xdnf.cn/news/3903.html

相关文章:

  • Spark,Idea中编写Spark程序 2
  • 题解:AT_abc245_e [ABC245E] Wrapping Chocolate
  • Go语言中的无锁数据结构与并发效率优化
  • Circular Plot系列(三):【视频教程】复现NCS图表之高大上的单细胞UMAP环形图
  • process terminated with status -1073741515
  • 永久免费的Google Colab 入门指南
  • C语言——寻找子串
  • 动态规划--回文串问题
  • 【深度学习-Day 5】Python 快速入门:深度学习的“瑞士军刀”实战指南
  • Vue常用优化
  • d3_v7绘制折线图
  • 启发式算法-遗传算法
  • C++ - 类和对象 #类的默认成员函数 #构造函数 #析构函数 #拷贝构造函数 #运算符重载函数 #赋值运算符重载函数
  • AI 入门:关键概念
  • 高等数学同步测试卷 同济7版 试卷部分 上 做题记录 第四章 不定积分同步测试卷 B卷
  • n8n 快速入门1:构建一个简单的工作流
  • 强化学习机器人模拟器——GridWorld:一个用于强化学习的 Python 环境
  • unorder_map/set的底层实现---C++
  • ESP32S3 多固件烧录方法、合并多个固件为单一固件方法
  • LangChain4J-XiaozhiAI 项目分析报告
  • 线程间通信--线程间顺序控制
  • C++类_局部类
  • 安装与配置Go语言开发环境 -《Go语言实战指南》
  • C#与西门子PLC通信:S7NetPlus和HslCommunication使用指南
  • JavaWeb:SpringBootWeb快速入门
  • 五、shell脚本--函数与脚本结构:搭积木,让脚本更有条理
  • JavaScript 中的 Proxy 与 Reflect 教程
  • 比特、字节与布尔逻辑:计算机数据存储与逻辑运算的底层基石
  • PMP-第四章 项目整合管理(一)
  • 享元模式(Flyweight Pattern)