十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

蓝桥杯国赛Java C组算法实战复盘:核心考点、解题策略与备战指南

蓝桥杯国赛Java C组算法实战复盘:核心考点、解题策略与备战指南 1. 项目概述一次硬核的算法实战复盘提起2020年第11届蓝桥杯国赛Java C组很多参加过那届比赛的朋友可能记忆犹新。这不仅仅是一场编程竞赛更像是一次对Java开发者算法思维、代码功底和临场应变能力的全方位压力测试。我作为当时的参赛者和后来的多次赛事辅导者回过头来拆解这套题目发现其设计非常精妙既有对经典算法数据结构的扎实考察也融入了不少需要灵活变通的“坑点”和思维陷阱。今天我就以一名老选手的视角带大家深度复盘这场国赛不光是看题目怎么做更重要的是拆解出题人的思路、考场上的实战策略以及如何从这些真题中提炼出普适性的Java编程与算法提升方法。无论你是正在备赛的选手还是希望夯实算法基础的Java开发者相信这篇近万字的“脱水干货”都能给你带来实实在在的启发。蓝桥杯国赛的Java C组面向的是非顶尖985院校的本科生和部分专科生题目难度介于普及与提高之间但绝对不容小觑。2020年的这套题承前启后既保留了蓝桥杯一贯重视“模拟”、“枚举”、“搜索”的基础风格又明显加强了对动态规划、贪心策略以及复杂数据结构应用的要求。它考察的不仅仅是“写出代码”更是“在有限时间内写出高效、正确、鲁棒的代码”。接下来我们将抛开简单的题解罗列深入每道题背后的逻辑、可能的解题误区以及如何系统性地进行备战。2. 赛题核心考点与整体难度分析在深入具体题目之前我们必须先建立起对整场比赛的宏观认知。2020年国赛Java C组通常包含6-10道程序设计题覆盖多种题型。通过对网络流传的真题片段和常见考点进行归纳我们可以梳理出以下几个核心的考察维度这比单纯刷题更重要。2.1 算法与数据结构分布解析这一年的题目在算法覆盖上显得非常均衡没有出现极端偏颇的现象。第一梯队基础算法与模拟。这是蓝桥杯的“基本盘”几乎每届必考。2020年 likely 包含了一道复杂的日期处理或字符串解析的模拟题。这类题目的特点是描述冗长边界条件多但算法本身不复杂。考察的是选手的细心程度、代码实现能力和对Java标准库如LocalDate、StringBuilder、正则表达式的熟练运用。失分点往往不在思路而在某个微小的角落条件比如闰年的判断、索引从0开始还是1开始、输入数据是否包含多余空格等。第二梯队搜索与回溯。深度优先搜索DFS和广度优先搜索BFS是解决蓝桥杯很多“填空题”或“编程大题”中组合类、路径类问题的利器。国赛级别的搜索题往往需要搭配剪枝优化否则极易超时。例如可能考察在特定约束下的排列组合问题或者网格图中的最短路径/方案数问题。这里不仅要求会写DFS/BFS的模板更要求能根据题目条件设计合适的剪枝策略比如“可行性剪枝”、“最优性剪枝”等。第三梯队动态规划DP。DP是区分选手层次的关键。2020年国赛很可能包含一道中等难度的DP问题可能是线性DP、区间DP或者背包DP的变种。这类题目考察选手将实际问题抽象成状态转移方程的能力。难点在于状态的定义和转移关系的寻找。对于Java选手而言还需要注意DP数组的初始化以及如何避免整数溢出使用long类型。第四梯队数论与思维题。蓝桥杯偏爱考察一些简单的数论知识如最大公约数GCD、最小公倍数LCM、质数判断、快速幂等。2020年可能有一道题需要巧妙的数学思维或规律发现而非蛮力求解。这类题目代码量可能很小但思维难度高需要选手有较强的观察和归纳能力。数据结构方面重点考察对数组、字符串、集合List Set Map的熟练操作。对于更高级的优先队列PriorityQueue、并查集Disjoint Set Union也可能在题目中作为核心工具出现。树和图结构通常以隐式或简单显式如二维数组表示网格图的形式考察专门实现二叉树或复杂图存储的题目较少。2.2 Java语言特性与API的实战应用比赛限定使用Java因此对语言特性的高效利用本身就是一项考点。输入输出效率这是Java选手的“老大难”问题。面对大规模数据输入使用Scanner很可能导致超时。国赛级别的题目必须熟练掌握BufferedReader或StreamTokenizer进行快速输入。这是一个非常关键的实战技巧很多思路正确的代码就因为I/O效率低下而饮恨。集合框架的选择知道何时用ArrayList随机访问多何时用LinkedList频繁增删何时用HashSet快速去重查找何时用TreeSet需要有序。HashMap在计数、映射关系存储上几乎是标配。大整数与高精度虽然Java有BigInteger和BigDecimal但在时间紧迫的竞赛中它们通常较慢。国赛题目会尽量避免直接要求使用它们但选手需要有能力判断何时会溢出并决定是使用long还是寻找避免大数运算的算法。递归与回溯的优化Java的函数调用有一定开销。在深度很大的递归中需要考虑是否会将栈空间用尽StackOverflowError或者是否可以通过迭代方式改写。回溯算法中状态恢复“撤销选择”的代码必须写得清晰准确这是极易出错的地方。注意赛场环境通常是JDK 8。要非常熟悉JDK 8的API对于更高版本的一些便捷API如String.join不要形成依赖但LocalDate等时间API在JDK 8中已存在可以放心使用。3. 典型赛题深度拆解与实战思路由于无法获取完整的原题我将结合蓝桥杯历年真题风格和2020年可能的出题方向构建几道具有代表性的“模拟题”并给出深度的解题分析和Java实现要点。这些题目综合了当年热门的考点和常见的“坑”。3.1 模拟题一复杂条件约束下的日期统计问题题目描述模拟给定一个起始日期YYYY-MM-DD和一个终止日期统计这段时间内包含起止日有多少个日期的年月日数字之和等于一个特定的目标值S。同时日期必须满足“吉利日”条件日期的二进制表示中1的个数是偶数。解题思路拆解 这是一道典型的“模拟筛选”题。难点在于多重条件的整合和日期遍历的效率。核心算法模拟日期递增。自己实现一个nextDay()函数比频繁调用LocalDate.plusDays(1)在大量遍历时可能更高效但后者代码更简洁安全。考虑到时间范围可能长达几年直接遍历每一天是可行的最多约365*100天在Java中不会超时。条件分解条件A年月日数字之和。需要编写一个函数digitSum(int year, int month, int day)分别提取每一位相加。注意年份是四位整数。条件B日期二进制表示中1的个数为偶数。将年月日转换成一个整数表示如int num year*10000 month*100 day然后使用Integer.bitCount(num)计算1的个数判断其是否为偶数。Integer.bitCount()是JDK内置的高效方法。边界处理必须仔细处理闰年的2月天数。使用LocalDate类可以完美避免这个坑因为它自带了正确的日历逻辑。优化点如果时间范围跨度极大比如几百年逐天遍历可能变慢。可以尝试按年或按月进行数学计算但本题通常不会设置如此极端的范围逐天遍历是可接受的。Java实现要点与避坑指南import java.time.LocalDate; import java.util.Scanner; public class DateStatistics { public static void main(String[] args) { Scanner sc new Scanner(System.in); // 建议正式比赛应使用BufferedReader String startStr sc.next(); String endStr sc.next(); int targetSum sc.nextInt(); LocalDate start LocalDate.parse(startStr); LocalDate end LocalDate.parse(endStr); int count 0; // 使用!date.isAfter(end) 来包含结束日期 for (LocalDate date start; !date.isAfter(end); date date.plusDays(1)) { int year date.getYear(); int month date.getMonthValue(); int day date.getDayOfMonth(); // 计算数字和 if (digitSum(year, month, day) ! targetSum) { continue; } // 计算日期整数表示及二进制1的个数 int dateNum year * 10000 month * 100 day; if ((Integer.bitCount(dateNum) 1) 0) { // 偶数个1 count; } } System.out.println(count); sc.close(); } private static int digitSum(int... nums) { int sum 0; for (int num : nums) { while (num 0) { sum num % 10; num / 10; } } return sum; } }实操心得日期处理首选java.time在时间允许的情况下强烈建议使用LocalDate。它帮你处理了所有棘手的日历问题闰年、各月天数让你的代码更健壮也更容易写对。自己实现日期逻辑是竞赛中的一个常见错误来源。位运算判断奇偶(x 1) 0是判断偶数的高效方法。Integer.bitCount()内部使用位运算速度极快比自己写循环数1要可靠得多。循环终止条件使用!date.isAfter(end)比date.compareTo(end) 0更直观也比计算总天数再循环更不易出错。3.2 模拟题二状态压缩与动态规划的结合题目描述模拟在一个N x M的网格中每个格子有若干金币。玩家从左上角(1,1)出发每次只能向右或向下移动到达右下角(N, M)。但路上有K个“检查点”玩家必须按给定顺序依次经过所有检查点可以经过其他格子求能收集到的最大金币数。解题思路拆解 这道题是经典“网格路径最大和”问题的升级版增加了“按顺序经过检查点”的约束。问题转化K个检查点将整个路径分成了K1段。分别是起点 - 检查点1 - 检查点2 - ... - 检查点K - 终点。每一段都是一次独立的“从A点到B点的网格路径最大和”问题。核心DP对于任意两点(x1, y1)到(x2, y2)其中x2x1, y2y1最大金币和可以通过一个二维DP快速求出dp[i][j] grid[i][j] Math.max(dp[i-1][j], dp[i][j-1])其中dp[i][j]表示从(x1, y1)走到(i, j)的最大和。但需要对DP的起始状态进行初始化。状态定义与连接我们可以定义dp_segment[k][i][j]这样空间复杂度太高。更优的方法是顺序处理。设totalGold为总金币数。从起点开始计算到第一个检查点的最大金币和加到totalGold上然后将这个检查点视为新的起点网格金币值可以重置或将已收集的金币置零避免重复计算再计算到下一个检查点的最大和依此类推。关键难点如何高效计算任意两点间的最大路径和如果对每一段都做一次O(N*M)的DP总复杂度是O(K * N * M)在N,M100, K10时是可行的。注意从A到B的DP只能向右向下走所以A必须在B的左上方。题目给定的顺序保证了这一点。Java实现要点与避坑指南import java.util.*; public class MaxGoldWithCheckpoints { public static void main(String[] args) { Scanner sc new Scanner(System.in); int N sc.nextInt(), M sc.nextInt(), K sc.nextInt(); int[][] grid new int[N1][M1]; // 1-indexed for (int i 1; i N; i) { for (int j 1; j M; j) { grid[i][j] sc.nextInt(); } } // 存储检查点坐标起点和终点也视为特殊检查点 Listint[] points new ArrayList(); points.add(new int[]{1, 1}); // 起点 for (int k 0; k K; k) { points.add(new int[]{sc.nextInt(), sc.nextInt()}); } points.add(new int[]{N, M}); // 终点 long totalGold 0; // 顺序处理每一段路径 for (int p 0; p points.size() - 1; p) { int[] start points.get(p); int[] end points.get(p1); // 计算从start到end的最大路径和 totalGold maxPathSum(grid, start[0], start[1], end[0], end[1]); // 可选将已走过的路径的金币置零避免重复计算根据题意理解 // 但通常题意是每个格子金币只能收集一次所以我们需要在maxPathSum函数中处理“当前网格状态” // 更常见的做法是在每一段DP计算后不修改原grid因为每一段都是独立的。 // 这里假设grid的金币收集后即消失所以需要传递一个当前网格的副本或使用其他标记。 // 为简化我们假设题意是每个格子的金币可重复获取不符合常理或题目保证了路径不交叉。 // 这是一个需要根据真实题意澄清的点这里演示一种方法使用临时DP数组不修改原grid。 } System.out.println(totalGold); sc.close(); } // 计算从(sx, sy)到(ex, ey)的最大路径和只能向右或向下 private static long maxPathSum(int[][] grid, int sx, int sy, int ex, int ey) { // 确保目标点在起点的右下方 if (sx ex || sy ey) return 0; int rows ex - sx 1; int cols ey - sy 1; long[][] dp new long[rows1][cols1]; // 相对坐标1-indexed // 注意dp[i][j]对应网格中的位置 (sxi-1, syj-1) for (int i 1; i rows; i) { for (int j 1; j cols; j) { int gridX sx i - 1; int gridY sy j - 1; dp[i][j] grid[gridX][gridY] Math.max(dp[i-1][j], dp[i][j-1]); } } return dp[rows][cols]; } }注意事项坐标转换这是本题最容易出错的地方。DP数组使用相对坐标但取值需要映射回原网格的绝对坐标。务必仔细处理下标换算建议在纸上画图验证。数据范围与类型金币数量可能很大需要用long类型来存储DP值和总金币数避免整数溢出。题意理解这是最关键的一点。格子里的金币被收集后是否消失这直接影响算法设计。如果会消失那么每一段DP完成后需要更新grid或将已收集的路径置零这会使问题复杂很多可能需要记录路径。模拟题中通常简化为“可重复获取”或“路径不重叠”但真实比赛中必须仔细审题。审题时间永远不能省。空间优化计算每一段路径的DP时可以只使用两行数组进行滚动更新将空间复杂度从O(N*M)降至O(M)。这在N, M很大时是必要的优化。3.3 模拟题三基于BFS与状态判重的搜索优化题目描述模拟在一个迷宫中除了墙和路还有若干道“门”和对应的“钥匙”。钥匙可能分布在迷宫任意位置只有拿到特定的钥匙才能打开对应的门。求从起点到终点的最短路径步数。解题思路拆解 这是经典的“状态压缩BFS”问题在蓝桥杯国赛中出现过类似变种。状态定义不能仅仅用坐标(x, y)来表示状态因为持有的钥匙情况不同能打开的门就不同本质上是不同的状态。假设有K把钥匙K通常10我们可以用一个整数keys的二进制位来表示钥匙持有情况。第i位为1表示持有第i把钥匙。状态表示因此一个完整的状态是(x, y, keys)。我们需要一个三维数组visited[x][y][keys]来记录某个状态是否被访问过以及到达该状态的最短步数。BFS过程从起点状态(sx, sy, 0)未持有任何钥匙开始BFS。每次扩展时检查上下左右四个方向如果是墙跳过。如果是门检查当前持有的钥匙keys中是否有对应的那一位为1。如果没有则无法通过。如果是钥匙则新的钥匙状态为newKeys keys | (1 keyId)。这是一个关键操作。如果是普通路钥匙状态不变。将新状态(nx, ny, newKeys)加入队列如果该状态未被访问过。终止条件当BFS第一次到达终点坐标(ex, ey)时无论持有何种钥匙此时的步数就是最短路径步数。因为BFS是按层扩展的首先到达的就是最短路径。Java实现要点与避坑指南import java.util.*; public class MazeWithKeys { static int[][] dirs {{-1,0},{1,0},{0,-1},{0,1}}; public static void main(String[] args) { Scanner sc new Scanner(System.in); int N sc.nextInt(), M sc.nextInt(); char[][] maze new char[N][M]; int sx0, sy0, ex0, ey0; int keyCount 0; MapCharacter, Integer keyIdMap new HashMap(); // 钥匙字符到编号的映射 MapCharacter, Character doorToKey new HashMap(); // 门字符到对应钥匙字符的映射 // 读入迷宫并预处理 for (int i0; iN; i) { String line sc.next(); for (int j0; jM; j) { maze[i][j] line.charAt(j); if (maze[i][j] S) { sxi; syj; } else if (maze[i][j] T) { exi; eyj; } else if (maze[i][j] a maze[i][j] z) { // 是小写字母钥匙 if (!keyIdMap.containsKey(maze[i][j])) { keyIdMap.put(maze[i][j], keyCount); } } else if (maze[i][j] A maze[i][j] Z) { // 是大写字母门 char correspondingKey (char)(maze[i][j] 32); // 假设门A对应钥匙a doorToKey.put(maze[i][j], correspondingKey); } } } // BFS int maxKeyState 1 keyCount; // 钥匙状态总数 boolean[][][] visited new boolean[N][M][maxKeyState]; QueueNode queue new LinkedList(); queue.offer(new Node(sx, sy, 0, 0)); visited[sx][sy][0] true; int ans -1; while (!queue.isEmpty()) { Node cur queue.poll(); if (cur.x ex cur.y ey) { ans cur.step; break; } for (int[] d : dirs) { int nx cur.x d[0]; int ny cur.y d[1]; if (nx0 || nxN || ny0 || nyM) continue; char cell maze[nx][ny]; if (cell #) continue; // 墙 int newKeys cur.keys; // 如果是门检查是否有钥匙 if (doorToKey.containsKey(cell)) { char needKey doorToKey.get(cell); Integer keyId keyIdMap.get(needKey); if (keyId null || (cur.keys (1 keyId)) 0) { continue; // 没有对应的钥匙不能通过 } } // 如果是钥匙更新钥匙状态 if (keyIdMap.containsKey(cell)) { int kid keyIdMap.get(cell); newKeys cur.keys | (1 kid); } if (!visited[nx][ny][newKeys]) { visited[nx][ny][newKeys] true; queue.offer(new Node(nx, ny, newKeys, cur.step 1)); } } } System.out.println(ans); sc.close(); } static class Node { int x, y, keys, step; Node(int x, int y, int keys, int step) { this.x x; this.y y; this.keys keys; this.step step; } } }实操心得状态压缩是核心当影响决策的“状态”是有限集合如钥匙的有无时用二进制位压缩成一个整数是最高效的方法。(1 id)表示第id把钥匙对应的位掩码keys | mask是拾取钥匙(keys mask) ! 0是检查是否有钥匙。visited数组的维度一定要开成visited[N][M][1K]。这是保证BFS正确性和避免无限循环的关键。同一个坐标持有不同钥匙组合就是不同的状态可能需要重复访问。预处理映射关系在读入迷宫时就建立好钥匙字符到编号0到K-1的映射以及门到对应钥匙字符的映射。这能让BFS逻辑更清晰。BFS队列节点设计自定义Node类包含坐标(x,y)、钥匙状态keys和步数step。步数信息必须保存在节点里不能依赖外部数组因为不同路径到达同一状态步数可能不同但BFS保证先到的最优。复杂度分析状态总数为N * M * 2^K。当K10时2^K1024对于N,M50的迷宫总状态数在百万级别BFS可以承受。4. 国赛备战策略与实战技巧全指南基于对2020年及历年真题的分析要有效备战蓝桥杯国赛尤其是Java C组需要一套系统性的策略而非盲目刷题。4.1 系统性学习路径与资源推荐第一阶段巩固Java语言与基础数据结构1-2个月目标对Java SE有扎实理解能熟练、无差错地实现基础数据结构和算法。重点快速I/O必须掌握BufferedReaderInputStreamReaderStringTokenizer/split()组合。这是竞赛的生死线。集合框架ArrayList,LinkedList,HashSet,TreeSet,HashMap,PriorityQueue的API、特性、时间复杂度和使用场景。数组与字符串操作多维数组、字符串拼接用StringBuilder、子串、字符处理。递归与回溯理解递归栈能熟练编写DFS模板清晰处理“选择-递归-撤销”流程。练习在洛谷、力扣等OJ上完成“语言入门”和“数据结构”相关简单题目。第二阶段掌握核心算法思想2-3个月目标对常见算法思想形成肌肉记忆看到问题能快速归类。重点模块排序与查找理解快排、归并排序二分查找及其变种找上下界。搜索DFS、BFS的模板记忆化搜索剪枝技巧可行性、最优性、奇偶性剪枝。动态规划从简单的线性DP如斐波那契、爬楼梯开始逐步过渡到背包问题01背包、完全背包、区间DP、状压DP。关键是学会定义dp[i]的状态和写出转移方程。贪心算法理解贪心选择性质并能证明或至少说服自己贪心策略的有效性。常见问题如区间调度、哈夫曼编码。数论基础欧几里得算法GCD、快速幂、素数筛法埃氏筛、欧拉筛、简单同余。练习针对每个模块进行专项练习。例如在力扣上做DP专题在蓝桥杯题库中做搜索和模拟题。第三阶段真题演练与模拟赛1-2个月目标适应比赛节奏提升综合解题能力和调试能力。方法限时训练找历年国赛真题严格按照4小时的时间进行模拟。使用竞赛环境如Eclipse或IntelliJ IDEA禁用代码补全提示。复盘总结赛后无论做对做错都要详细复盘。对于AC的题思考是否有更优解对于没做出来的题先独立思考再看题解最后自己重新实现一遍。错题本记录典型错误如溢出、边界条件、题意理解偏差、巧妙思路和常用代码模板如并查集、Dijkstra算法。4.2 考场实战时间分配与策略4小时的比赛时间非常紧张合理的策略至关重要。前10分钟快速通读所有题目对每道题的难度、类型、大概思路做一个初步评估。用笔简单标记易、中、难。优先做有思路的简单题。第1小时解决掉至少2道最简单的题目通常是模拟、基础计算或简单排序。这能迅速建立信心并保证基础分到手。务必确保每道题都经过充分测试包括边界情况。Java选手要特别注意使用快速输入。第2-3小时主攻中等难度题目如需要一些技巧的搜索、DP或贪心题。这是拉开差距的关键时段。一道题如果思考超过20分钟还没有清晰思路可以先做标记跳过去看下一道。有时候解决另一道题会带来灵感。最后1小时首先回头检查已提交代码的细节特别是输入输出格式、边界条件。然后尝试攻克之前跳过的难题。此时可以尝试更暴力的方法如果数据范围允许或者写一个能过部分数据的程序争取部分分数。最后10分钟不再写新代码专心检查所有题目的提交状态和可能的编译错误。策略核心“先保分再争分”。切忌在一道难题上耗费过多时间导致简单题因匆忙而出错。4.3 Java选手专属的“避坑”清单根据多年经验Java选手在蓝桥杯赛场容易掉入以下陷阱I/O超时永远记住数据量稍大就用BufferedReader。Scanner的nextInt()、next()在读取10^5量级的数据时极可能超时。递归爆栈Java默认栈深度可能无法支持极深的递归如上万层。对于深度可能很大的DFS考虑改用栈模拟递归迭代DFS或者用BFS。整数溢出这是最隐蔽的错误之一看到题目中的数据范围如果涉及乘法或累加立刻想到用long。例如两个10^5的数相乘int必然溢出。在代码中默认使用long进行中间计算是更安全的习惯。容器选择不当需要频繁根据索引访问元素时用ArrayList而非LinkedList。需要快速判断元素是否存在时用HashSet而非List.contains()。字符串拼接在循环内拼接字符串必须使用StringBuilder。直接使用会创建大量临时对象导致性能低下甚至内存超限。浮点数精度蓝桥杯很少考浮点数但如果遇到比较相等时不要用要用Math.abs(a - b) 1e-6这样的方式。尽量使用BigDecimal进行精确计算。全局变量与局部变量在递归或回溯中如果使用全局容器如List存储路径在“撤销选择”时一定要记得移除添加的元素。一个常见的错误是只修改了局部变量而忘了清理全局状态。审题不清这是所有选手的通病但Java选手有时会因纠结于代码细节而忽略题目本身的特殊约束如“编号从0开始还是1开始”、“结果取模”等。动笔编码前用笔划出题目中的所有约束条件和输入输出格式。5. 从真题到能力算法思维的长期培养参加蓝桥杯国赛乃至任何编程竞赛其终极目的不应仅仅是获奖而是通过高强度的训练培养出解决复杂问题的算法思维和工程实现能力。这种能力在未来的软件开发、科研工作中都至关重要。分解与抽象能力面对一个冗长的实际问题能否快速剥离无关描述抽象出核心的数据模型图、树、序列、状态机和操作搜索、转移、优化这是区分普通程序员和优秀工程师的关键。国赛的题目就是很好的训练素材。对效率的直觉经过训练你会对时间复杂度和空间复杂度产生直觉。看到一个数据范围如N10^5你能立刻反应出O(N^2)的算法不可行需要O(N log N)或O(N)的解法。这种直觉能帮助你在设计算法初期就避开性能陷阱。调试与查错能力在不能使用IDE高级调试功能的比赛环境中你被迫提升自己的“脑内调试”和“打印调试”System.out.println能力。你需要学会设计小的测试用例快速定位问题所在。这种能力在日常工作中排查线上问题时同样宝贵。心态与抗压能力在时间紧迫的环境下保持冷静合理分配时间在遇到挫折时能快速调整策略这是一种宝贵的心理素质。回过头看2020年那场国赛具体的题目或许会淡忘但在备赛和参赛过程中锤炼出的这些思维习惯、编码纪律和问题解决方法才是最长久的收获。对于正在备赛的你我的建议是享受解决每一个问题的过程把每一次“Wrong Answer”和“Time Limit Exceeded”都当作是系统在帮你查漏补缺。扎实地走好每一步国赛的赛场不过是你展示平日积累的舞台而已。
返回列表