ARTICLE DETAIL

资讯详情

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

CSP-J/S 初赛阅读程序题备考手册:先辨类型,再定输出

CSP-J/S 初赛阅读程序题备考手册:先辨类型,再定输出 摘要初赛后 70 分几乎全是读码但很多人拿到程序就开始逐行模拟越模拟越乱。这篇把「先辨类型、再定输出」的方法整理成手册含代码标识速查表、输出判断四步、稳定性与复杂度表、图论/树与排列组合公式以及一批极容易记混的结论。建议收藏当字典。0. 这份手册怎么用备考 CSP-J/S 的过程中我发现最容易丢分的地方其实很集中——阅读程序题时不知道这段程序到底在干什么。初赛的阅读与完善程序占了绝大部分读码量但很多人拿到代码就开始逐行模拟越模拟越乱时间花了、分却没拿到。这篇把实战中总结的「先辨类型、再定输出」方法整理成一份手册内容包括代码标识速查表、输出判断四步、算法稳定性与复杂度表、图论与树的核心公式、排列组合公式集以及一批极容易记混的结论。建议平时当字典查考前只浏览一遍所有 ⚠️ 红字——那是从大量真题里淘出来的高频陷阱。这是一份工具型手册拿到程序题先辨类型 → 再确定输出 → 再套公式。配套的《备考数据卡》侧重薄弱点诊断两者互补。先扫第 1、2 节读码辨类型 定输出——这是后 70 分阅读完形的核心得分点。再背第 6 节公式表和第 3、4 节稳定性/复杂度表——选择题直接考。最后看第 8 节盲区审计 第 9 节易误导澄清 第 12 节速查——补平时容易忽略的角落。所有⚠️红字 从真题里淘出来的高频陷阱易错 / 易误导考前只翻这些就够。1. 程序题快速辨别法大型方向核心思路先看主数据结构 → 再看主循环在干啥 → 最后看 return/输出。下面是「看到 X 标识 → 多半是 Y 题」的速查表。代码里的明显标识多半是什么题关键特征visited[] 递归/栈 回溯DFS / 搜索一条路走到底再回头queuewhile(!q.empty())层序BFS / 拓扑一层一层扩散forswapflag冒泡 /formin选择 /for挪位插入排序算法三重或两重循环搬数parent[]find()union()并查集合并集合、查连通dp[i]max/min(dp[i],...)动态规划状态转移数组l0; rn; while(lr){mid...}二分 / 二分答案夹逼区间heap/push_down/priority_queue堆 / 优先队列上浮下沉next[26]/ 节点数组 /trieTrie 字典树字符分支fail[]/next[]双指针失配KMP字符串匹配tree[]/seg/lazy线段树区间查询修改map/set/ 平衡旋转红黑树STL 底层有序容器graph[][]/adj[]/edge图邻接矩阵/表a[i]a[i]^a[i-1]/lowbit/ 按位与 / 异或^ / 移位位运算按位操作辨别顺序铁律强烈建议养成习惯第一句先说「这操作的是什么数据结构」树/图/数组/栈/字符串再读码。不亮结构就模拟执行必乱。1.1 实战演练两段代码用上面的表走一遍例 1 —— 看起来像排序其实问的是次数int n, a[105], cnt 0; int main() { cin n; for (int i 0; i n; i) cin a[i]; for (int i 0; i n - 1; i) for (int j 0; j n - 1 - i; j) if (a[j] a[j 1]) { swap(a[j], a[j 1]); cnt; } cout cnt endl; return 0; }对照第 1 节的表两重forswap 相邻比较 →冒泡排序。再走四步法输入是数组 a核心结构是排序关键变量是cnt每交换一次 1输出的是cnt而不是排好序的数组。⚠️ 这一步就是这道陷阱题的全部它问的是「交换了多少次」而这个次数恰好等于原数组的逆序对数量见第 7 节。很多人模拟完数组、却忘了看cout后面跟的是哪个变量。例 2 —— 一眼认出 BFS 按层扩展int dx[4] {1, -1, 0, 0}, dy[4] {0, 0, 1, -1}; queuepairint,int q; bool vis[15][15]; int bfs(int sx, int sy) { q.push({sx, sy}); vis[sx][sy] true; int step 0; while (!q.empty()) { int sz q.size(); // ⚠️ 关键一次性取当前层的节点数 for (int k 0; k sz; k) { auto [x, y] q.front(); q.pop(); for (int d 0; d 4; d) { int nx x dx[d], ny y dy[d]; if (nx 0 || nx n || ny 0 || ny m) continue; if (vis[nx][ny] || g[nx][ny] #) continue; vis[nx][ny] true; q.push({nx, ny}); } } step; } return step; }标识非常明显queuewhile(!q.empty()) 方向数组dx/dyvis[][]→BFS 网格最短路。⚠️ 这里最容易看漏的一行是int sz q.size()把当前层的节点数先固定下来再遍历这是「按层扩展」的标准写法。有这一行step就是层数也就是从起点出发的最短距离没有这一行就只能知道访问顺序读不出距离。两个例子共同的套路先认结构排序 / BFS再盯住最后cout的那个变量。这两步做到读码题基本不会空手。2. 如何确定「程序到底输出什么」拿到阅读程序题按这四步走黑盒读码四步法定输入cin/scanf读进来几个变量、什么类型。定核心结构是 DFSDP排序用第 1 节辨出来。定关键变量语义循环里被反复改的那个变量它代表「计数 / 最大值 / 路径和 / 逆序对」中的哪一个。定输出cout/printf最后一打印的是哪个变量——是它的值、还是下标、还是count、还是整个序列。⚠️ 输出陷阱最容易出错输出的是下标还是值数组题最爱考。输出的是count还是具体序列。递归返回值vs 全局变量被改。引用修改会改掉原数组模拟时容易漏。全局变量初值默认 0vs 局部变量未初始化。3. 算法稳定性稳定 vs 不稳定定义排序后两个相等元素的相对先后顺序是否保持不变。保持 → 稳定打乱 → 不稳定。排序稳定性备注 / 易错冒泡排序稳定相等不交换插入排序稳定相等插后面归并排序稳定合并时先取左计数 / 桶 / 基数稳定基数法本身稳定选择排序不稳定跨过相等元素去换快速排序不稳定⚠️ 很多人误以为稳堆排序不稳定堆顶跳跃希尔排序不稳定分组跳跃⚠️ 务必牢记快排不稳定、选择不稳定、堆排不稳定——这三是最常考的稳定判断题记错就会丢分。4. 算法复杂度各类必背算法最好平均最坏空间稳定冒泡O(n)※O(n²)O(n²)O(1)稳定选择O(n²)O(n²)O(n²)O(1)不稳插入O(n)O(n²)O(n²)O(1)稳定快排O(n log n)O(n log n)O(n²)O(log n)不稳归并O(n log n)O(n log n)O(n log n)O(n)稳定堆排O(n log n)O(n log n)O(n log n)O(1)不稳二分查找—O(log n)O(log n)O(1)—顺序查找—O(n)O(n)O(1)—DFS / BFS—O(VE)O(VE)O(V)—Dijkstra数组—O(V²)O(V²)O(V)—
返回列表