目录前言试题 A密密摆放5 分・结果填空问题描述解题思路答案总结试题 B脉冲强度之和5 分・结果填空问题描述解题思路代码实现答案总结试题 C25 之和10 分・编程题问题描述输入格式输出格式样例输入 1样例输出 1样例输入 2样例输出 2解题思路代码实现试题 D旗帜10 分・编程题问题描述输入格式输出格式样例输入样例输出解题思路代码实现试题 E数列差分15 分・编程题问题描述输入格式输出格式评测用例规模与约定解题思路代码实现试题 F基因配对15 分・编程题问题描述输入格式输出格式样例输入样例输出解题思路代码实现试题 G栈与乘积20 分・编程题问题描述输入格式输出格式评测用例规模与约定解题思路代码实现试题 H破解信息20 分・编程题问题描述输入格式输出格式样例输入样例输出解题思路代码实现赛后总结前言2025 年第 16 届蓝桥杯软件类 Java 组省赛已落下帷幕不同赛区因特殊情况部分使用了备用卷但整体题型延续了 基础为主、梯度区分 的特点。前两道填空题侧重规律分析中间题型聚焦基础算法实现后两道难题则考验数据结构与逻辑优化能力。本文整理了 Java 组全题的详细题解包含问题描述、核心思路、完整代码及易错点提示所有代码均严格遵循比赛规范类名统一为 Main适合备赛同学复盘学习。文中答案与思路为个人解题总结仅供参考。试题 A密密摆放5 分・结果填空问题描述小蓝有一个内部长宽高分别为 200、250、240 毫米的大箱子要用它存放同样大小的小盒子外部长宽高 30、40、50 毫米。小盒子允许从各个方向旋转请问最多能放多少个小盒子解题思路本题核心是判断小盒子在大箱子中的三维摆放适配性无需复杂算法关键在于发现尺寸间的倍数关系小盒子可旋转其有效尺寸组合为 30×40×50任意维度可互换大箱子尺寸 200×250×240 恰好分别是小盒子 50、50、40 的 4 倍、5 倍、6 倍 不对重新看大箱子 200 是 40 的 5 倍250 是 50 的 5 倍240 是 30 的 8 倍组合验证5×5×8200 个且体积完全匹配200×250×240 200×30×40×50无空间浪费。答案总结200试题 B脉冲强度之和5 分・结果填空问题描述脉冲强度 p 需满足三个条件由连续 10 个正整数之和组成存在 k 使 pk(k1)...(k9)各个数位上的数字都相同如 111、2222数值不超过 20255202。求所有符合条件的脉冲强度之和。解题思路条件转化连续 10 个整数和为等差数列求和p10k45因此 p-45 必为 10 的倍数且 p 的个位数字一定是 5范围筛选符合条件的 p 只能是 5、55、555、...、55555555个位为 5 且所有数位相同且不超过 20255202验证计算遍历所有候选数验证是否满足 p-45 能被 10 整除累加符合条件的数值。代码实现public class Main { public static void main(String[] args) { long ans 0L; // 生成所有个位为5且数位相同的数上限20255202 long p 5; while (p 20255202) { if ((p - 45) % 10 0) { ans p; } // 生成下一个候选数在末尾加5 p p * 10 5; } System.out.println(ans); } }答案总结6172830试题 C25 之和10 分・编程题问题描述给定正整数 n求从 n 开始的连续 25 个整数的和n (n1) ... (n24)。输入格式输入一行包含一个正整数 n。输出格式输出一行包含一个整数表示答案。样例输入 11样例输出 1325样例输入 2100样例输出 22800解题思路直接解法循环累加 25 个连续整数n 最大为 10000 时总和为 10000×25 (01...24) 250000 300 250300远小于 long 类型上限无需担心溢出优化解法利用等差数列求和公式和 25×n (24×25)/2 25n 300可直接计算无需循环。代码实现import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); // 等差数列求和公式优化避免循环 long result 25L * n 300; System.out.println(result); } }试题 D旗帜10 分・编程题问题描述小蓝要画一个 h×w 的矩形图形图形规律为第一行用 LANQIAO 重复填入从第二行开始每行向左移动一个字符同样用 LANQIAO 重复填入。求图形中字母 A 的个数。输入格式输入第一行包含两个正整数 h、w用空格分隔。输出格式输出一行包含一个整数表示答案。样例输入5 10样例输出14解题思路核心规律基础字符串为 LANQIAO长度 7每行的起始偏移量比上一行多 1第一行偏移 0第二行偏移 1...第 h 行偏移 h-1字符定位对于第 i 行0≤ih第 j 列0≤jw的字符为基础字符串 [(i j) % 7]统计优化无需生成完整矩阵直接遍历每行每列判断对应位置是否为 A 并计数。代码实现import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int h sc.nextInt(); int w sc.nextInt(); String base LANQIAO; // 基础字符串 int count 0; for (int i 0; i h; i) { // 行偏移量为i for (int j 0; j w; j) { // 列 if (base.charAt((i j) % 7) A) { count; } } } System.out.println(count); } }试题 E数列差分15 分・编程题问题描述给定一个长度为 n 的数列 a对其进行 m 次操作每次操作给定 l、r、v将 a [l] 到 a [r] 之间的所有元素都加上 v数列下标从 1 开始。请输出经过所有操作后的数列。输入格式输入第一行包含两个正整数 n、m。第二行包含 n 个整数表示初始数列 a。接下来 m 行每行包含三个整数 l、r、v表示一次操作。输出格式输出一行包含 n 个整数表示经过所有操作后的数列。评测用例规模与约定对于 40% 的评测用例1 ≤ n, m ≤ 1000对于所有评测用例1 ≤ n, m ≤ 10^51 ≤ l ≤ r ≤ n|v| ≤ 1000。解题思路暴力解法局限直接对每次操作的 [l,r] 区间累加时间复杂度 O (mn)无法应对 10^5 规模的数据差分优化原理利用差分数组 d其中 d [1] a [1]d [i] a [i] - a [i-1]i1。对区间 [l,r] 加 v 等价于 d [l] v、d [r1] - v若 r1≤n还原数列所有操作完成后通过差分数组前缀和计算得到最终数列时间复杂度 O (nm)。代码实现import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { // 大数据输入需用BufferedReader优化速度 BufferedReader br new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st new StringTokenizer(br.readLine()); int n Integer.parseInt(st.nextToken()); int m Integer.parseInt(st.nextToken()); long[] a new long[n 2]; // 1-based预留r1位置 st new StringTokenizer(br.readLine()); for (int i 1; i n; i) { a[i] Long.parseLong(st.nextToken()); } // 构建差分数组 long[] diff new long[n 2]; diff[1] a[1]; for (int i 2; i n; i) { diff[i] a[i] - a[i - 1]; } // 处理m次操作 for (int i 0; i m; i) { st new StringTokenizer(br.readLine()); int l Integer.parseInt(st.nextToken()); int r Integer.parseInt(st.nextToken()); long v Long.parseLong(st.nextToken()); diff[l] v; if (r 1 n) { diff[r 1] - v; } } // 还原数列并输出 StringBuilder sb new StringBuilder(); long current 0; for (int i 1; i n; i) { current diff[i]; sb.append(current).append( ); } System.out.println(sb.toString().trim()); } }试题 F基因配对15 分・编程题问题描述基因序列由 A、T、C、G 四种碱基组成规定配对规则为 A-T、T-A、C-G、G-C。给定两个长度分别为 n 和 m 的基因序列 s 和 t求 t 在 s 中所有可能的匹配位置数量。匹配定义为存在 s 的某个子序列其长度与 t 相同且每个位置的碱基都能与 t 对应位置配对。输入格式输入第一行包含字符串 s。第二行包含字符串 t。输出格式输出一个整数表示匹配位置的数量。样例输入ATCGATC TCG样例输出2解题思路配对映射先建立碱基配对的哈希表如 map [A]T、map [T]A 等快速判断碱基是否匹配双指针查找对于 s 中的每个起始位置 i用双指针 j遍历 t和 k遍历 s 从 i 开始判断 t [j] 是否与 s [k] 配对若匹配则 j 和 k 同时后移直到 j 遍历完 t表示找到一个匹配边界处理当 s 剩余长度s.length ()-i小于 t.length () 时无需继续判断直接退出循环。代码实现import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); String s sc.next(); String t sc.next(); int n s.length(); int m t.length(); if (m n) { System.out.println(0); return; } // 建立配对映射 MapCharacter, Character pairMap new HashMap(); pairMap.put(A, T); pairMap.put(T, A); pairMap.put(C, G); pairMap.put(G, C); int count 0; // 遍历所有可能的起始位置 for (int i 0; i n - m; i) { boolean match true; for (int j 0; j m; j) { char target pairMap.get(t.charAt(j)); if (s.charAt(i j) ! target) { match false; break; } } if (match) { count; } } System.out.println(count); } }试题 G栈与乘积20 分・编程题问题描述给定一个包含 n 个正整数的序列将其依次压入栈中在压栈过程中可以随时弹出元素。要求弹出的元素序列的乘积尽可能大且弹出序列必须是非空的。求这个最大乘积。输入格式输入第一行包含一个正整数 n。第二行包含 n 个正整数表示序列。输出格式输出一个整数表示最大乘积。评测用例规模与约定对于 30% 的评测用例1 ≤ n ≤ 10对于所有评测用例1 ≤ n ≤ 1000序列元素均不超过 10。解题思路动态规划定义设 dp [i] 表示处理前 i 个元素后栈顶元素为序列第 i 个元素时的最大乘积若弹出则为乘积值若不弹出则为当前栈内元素乘积的中间状态状态转移若当前元素 x1dp [i] dp [i-1] * x若 dp [i-1] 存在且 0或 x若 dp [i-1]≤0 或 i1若当前元素 x1由于 1 不增加乘积可选择不弹出dp [i] dp [i-1]若 dp [i-1] 存在或 1若当前元素 x1本题为正整数无此情况需弹出之前的元素取当前最大乘积结果更新每次计算 dp [i] 后更新全局最大乘积。代码实现import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); int[] arr new int[n]; for (int i 0; i n; i) { arr[i] sc.nextInt(); } long[] dp new long[n]; long maxProduct arr[0]; dp[0] arr[0]; for (int i 1; i n; i) { int x arr[i]; // 状态转移选择与前一个栈顶乘积结合或单独作为新的栈顶 if (dp[i-1] 1) { dp[i] dp[i-1] * x; } else { dp[i] x; } // 更新最大乘积 if (dp[i] maxProduct) { maxProduct dp[i]; } } System.out.println(maxProduct); } }试题 H破解信息20 分・编程题问题描述一条加密信息由 n 个非负整数组成加密规则为对于每个位置 i1≤i≤n加密后的值 b [i] a [i] XOR a [i1]其中 a [n1] a [1]即循环异或。给定加密后的序列 b求原始序列 a 的任意一个可能解。若不存在解则输出 - 1。输入格式输入第一行包含一个正整数 n。第二行包含 n 个整数表示加密序列 b。输出格式输出一行包含 n 个整数表示原始序列 a。若无解输出 - 1。样例输入3 1 2 3样例输出0 1 3解题思路推导关系根据加密规则推导原始序列与加密序列的关系a[2] a[1] XOR b[1]a[3] a[2] XOR b[2] a[1] XOR b[1] XOR b[2]...a[n] a[1] XOR b[1] XOR b[2] XOR ... XOR b[n-1]循环条件a [1] a [n] XOR b [n]求解 a [1]将 a [n] 代入循环条件得到关于 a [1] 的方程。由于异或运算的性质方程有解的充要条件是 b 序列的异或和为 0因为等式两边 a [1] 会抵消构造解若有解设 a [1] 0或任意值根据上述推导公式计算出所有 a [i]。代码实现import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); int[] b new int[n]; int xorSum 0; for (int i 0; i n; i) { b[i] sc.nextInt(); xorSum ^ b[i]; } // 无解条件异或和不为0 if (xorSum ! 0) { System.out.println(-1); return; } // 构造解设a[0] 0对应a[1] int[] a new int[n]; a[0] 0; int prefixXor 0; for (int i 1; i n; i) { prefixXor ^ b[i-1]; a[i] a[0] ^ prefixXor; } // 输出结果 StringBuilder sb new StringBuilder(); for (int num : a) { sb.append(num).append( ); } System.out.println(sb.toString().trim()); } }赛后总结2025 年 Java 组省赛整体难度适中主要考察以下能力基础语法与数据类型如 long 类型避免溢出试题 B、E、输入输出优化试题 E算法思维差分优化试题 E、双指针试题 F、动态规划试题 G、异或性质应用试题 H规律观察填空题侧重数字规律与倍数关系试题 A、B减少计算量。备考建议重点练习等差数列求和、差分、异或等基础算法掌握大数据输入输出优化技巧同时注重填空题的规律分析能力可显著提升答题效率。