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

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/

相关文章:

  • Python变量作用域陷阱:为什么函数内赋值会引发_局部变量未定义
  • Day 4:牛客周赛Round 91
  • I.MX6U的GPIO配置和LED点灯实验。
  • Dream it possible歌词中英文对照
  • 使用python写多文件#inlcude
  • GoLang基础(续)
  • 腾讯云服务器技术全景解析:从基础架构到行业赋能​
  • 人员睡岗玩手机检测数据集VOC+YOLO格式3853张3类别
  • 第13章:陈默再访海奥华
  • 2024年第十五届蓝桥杯省赛B组Python【 简洁易懂题解】
  • QT开发工具对比:Qt Creator、Qt Designer、Qt Design Studio
  • 详细案例,集成算法
  • 技术部测试规范
  • 工业AI质检:从传统算法到多模态大模型应用
  • 大模型实践:图文解锁Ollama在个人笔记本上部署llm
  • 学习黑客红队模拟演练报告
  • 如何克服情绪拖延症?
  • 《算法导论(原书第3版)》下载
  • 【Java学习笔记】方法重载
  • Redis 过期与淘汰机制全解析
  • 今年五一档电影票房已破7亿
  • GOMU超马世锦赛,男女冠军刷新世界纪录
  • 全国共有共青团员7531.8万名,共青团组织439.7万个
  • 挑大梁!一季度北上广等7省份进出口占外贸总值四分之三
  • 陈逸飞《黄河颂》人物造型与借鉴影像意义
  • 铁路12306回应“五一前大量放票”传闻:个别方向和区段出现新增票额,均即时进入系统重新发售