基础OJ第二天:吃透04-06题,避开多组输入与格式陷阱
走出新手村的第一步往往不是会写代码而是会读题。第二天继续推进基础OJ的04到06题这个节奏其实非常关键。很多人第一天兴致勃勃刷了前三题第二天一上来看见题目变长、格式复杂就直接卡住心态崩一大半。这个阶段真正要练的不是算法天赋而是把“题目要求”翻译成“代码逻辑”的熟练度。下面我把这三道题的拆解思路、常见雷区、以及我当时踩过的坑一起整理出来希望能帮你顺顺利利滑过这个坎。1. 内容整体设计与思路拆解1.1 为什么“基础OJ”阶段最容易拉开差距先说说我这边的体会。OJOnline Judge刷题尤其是基础阶段的04到06题很多人的差别不在智商而在“习惯”。第一天大家都是在兴奋期三道简单题十几分钟搞定感觉不过如此。但第二天题目就会开始变花样比如多组输入、特殊终止条件、字符串里藏着空格、输出格式要求“Case #”前缀这些细枝末节才是真正刷人的地方。我自己在带新人刷题的时候总结过一个规律能稳定通过OJ前10题的人并不是因为代码写得有多飘逸而是他们愿意在动手前多花两分钟把题目输入输出格式吃透。基础OJ的后几题其实就是在反复帮你养成这个习惯。04到06这个位置之所以特殊是因为它刚刚好越过“Hello World”级别的心理防线开始让你面对真实竞赛中的格式陷阱和边界条件。1.2 三道题背后隐藏的知识点连线这个阶段的题目表面看是“求AB”“排序”“字符串处理”实际上背后连着的知识点是一条完整的技能树。04题大概率是让你理解标准输入输出流的处理方式覆盖多组数据的循环读取05题往往就会引入数组和累计计算需要你注意初始化变量这种细节06题则经常开始考字符串类函数比如计算长度、比较字符、或者处理固定宽度的输出。换句话说这三道题分别对应了“读入—处理—输出”这三个环节。做题的时候不能只盯着题目本体更要意识到每一道题是在为后续的数据结构题目打底子。比如05题里如果要对一堆数字求平均值那你一定会用到循环里累积求和这个模式在后面的前缀和、滑动窗口里还会反复出现。基础题的练习价值从来不在于题目本身难度而在于它帮你把常用的代码骨架练到形成肌肉记忆。1.3 选对OJ平台和题号比闷头刷题更重要热词里提到的杭电OJ、东方博宜OJ、华为OJ这些都是刷题圈子里出现频率很高的平台。但作为第二天的进度我不建议一次性注册五六个平台那样会分散精力。选择一个主平台比如杭电OJ或者学校推荐的OJ系统把04到06这三题吃透比到处打卡更有意义。我当时用的是“先全局扫一遍再逐个击破”的策略。拿到04到06的题目列表后先把三道题都读一遍感受一下难度梯度。如果发现有明显卡壳的不用死磕先跳到后面一题看看往往后面那题反而简单。这种“跳读法”在基础阶段特别好用能避免在某一题上钻牛角尖导致整个晚上的进度归零。2. 核心细节解析与实操要点2.1 输入格式读懂“多组测试数据”这一句话基础OJ的题目里经常会出现一句话输入包含多组测试数据每组数据占一行。这句话很多新手会下意识忽略但实际上它是整套题最关键的解题线索。以杭电OJ的经典题为例如果题目要求输入两个整数直到EOF结束那你的代码核心就是while循环配scanf而不是写一个只读一次的main函数。有人可能觉得这是常识但我在实际答疑中发现十个人里有四个会在这上面翻车尤其是C语言选手容易在scanf的返回值上犯迷糊。这里有个小技巧scanf的返回值是成功读入的变量个数当你用while(scanf(%d %d, a, b) ! EOF)这种写法时代码会在没有输入时自动退出循环。这比while(cin a b)更容易理解失败但两者本质都是判断输入流是否结束。注意如果是C选手while(cin a b)本身就足够用不需要额外判断EOF。C语言则建议养成检查scanf返回值的习惯能有效避免后续题目中出现“输出超限”或“运行时错误”。2.2 输出格式空格、换行、Case前缀一个都不能少三道题里的输出格式要求往往是区分“正确”和“格式错误”的分水岭。常见的要求包括“每个输出占一行”“每组输出之间用一个空行隔开”“Case 1: 结果”这类固定前缀。这里需要特别提醒OJ系统中有一个经典的Presentation Error翻译过来就是“输出格式错误”通常意味着你的答案在逻辑上是对的但多了一个空格或者少了一个换行。应付这个问题的标准动作是“照着题目抄输出”。题目里如果写了Case #1:那冒号后面有没有空格也要原样保留。我之前见过一个同学题目写的是“Case 1: 5”他偏要输出成“Case #1: 5”结果连续报了四次PE格式错误查了半天才发现是多了一个井号。这种坑完全可以通过逐字对照题目文本来规避。2.3 数据范围亮出“边界值”这把照妖镜基础OJ的06题往往会让数据范围变大比如输入的数可能达到10^9但总和可能超过32位整数的上限。如果题目里看到int可能存不下的信号比如数值范围达到10^9甚至更大或者要求“输出保留两位小数”“结果可能很大”你要立刻想到使用long long或double。我经常跟新手强调一个习惯看到数字先看范围再看类型。这是刷OJ跟写业务代码最大的不同之一。业务代码里你很少关心一个订单id会超过int上限但OJ的卡点恰恰就在这里。04到06这三题看似简单其中某一题很可能就藏着这种数据范围陷阱让你从WAWrong Answer中慢慢意识到类型的重要性。3. 实操过程与核心环节实现3.1 从零搭建一个稳定的本地调试环境动手做题前先把本地环境准备好。我自己习惯用VS Code搭配MinGW或GCC编译命令很简单gcc -o main main.c。如果你懒得敲命令也可以装Code Runner插件但不能只依赖它因为OJ的编译器版本和本地未必一致。这里分享一个保险做法提交前把代码复制到OJ的在线编辑框之前先在本地用题目给出的样例测试一遍确认输出完全一致再提交。3.2 手把手演示一道“AB”风格基础题的完整迭代为了把流程走通我用一道典型的“求两个数之和”风格题目来演示。假设题目要求输入多组数据每组两个整数a和b输出ab的值直到输入两个0时结束。代码如下#include stdio.h int main() { int a, b; while (scanf(%d %d, a, b) 2) { if (a 0 b 0) break; printf(%d\n, a b); } return 0; }这里有两个关键点第一scanf(%d %d, a, b) 2用来确保输入真的包含了两个整数第二遇到0 0时用break跳出循环而不是继续输出0。如果题目改成“输出Case 1: 3”这种格式只需要加一个计数器变量#include stdio.h int main() { int a, b; int caseNo 1; while (scanf(%d %d, a, b) 2) { if (a 0 b 0) break; printf(Case %d: %d\n, caseNo, a b); } return 0; }这种答题框架几乎可以覆盖所有“多组数据处理”类的基础题。你把核心业务逻辑写在printf那行就行其他的都算固定模板。刷题刷久了你会发现模板化并不丢人它能减少低级失误把注意力集中在真正的逻辑差异上。3.3 解析一道求和类题目的内存与变量初始化问题再来说05题这类累计求和的题。常见错误是把累加变量定义在循环内部导致每次清零或者忘记初始化成0。假设题目要求输入N然后输入N个数求这N个数的和。典型写法#include stdio.h int main() { int n, i, sum, val; while (scanf(%d, n) ! EOF n ! 0) { sum 0; for (i 0; i n; i) { scanf(%d, val); sum val; } printf(%d\n, sum); } return 0; }这里的sum 0;必须放在while循环内部因为每一组数据都要求一个独立的总和。如果你把它放在while前面那第二组数据的结果就会包含第一组的总和导致连续的WA。这个错误非常隐蔽样例输入通常只有一组数据所以本地测试完全看不出问题直到提交后才被打脸。我的经验是涉及到“每组数据独立计算”的题先把循环边界写出来再考虑变量的作用域。很多时候只要你画出循环的括号范围变量的声明位置就不会放错。3.4 字符串题目中的“坑中之坑”到了06题很多平台会开始引入字符串处理。C语言里没有原生的字符串类型只能用字符数组这就带来了两个常见问题一是忘记清空缓冲区二是忘记在字符数组末尾补\0。C选手则更常栽在cin无法读取含空格的字符串上。举个例子如果题目要求读入一行包含空格的字符串统计其中某个字符出现的次数在C里应该用getline(cin, str)而不是cin str。C语言则建议用fgets(str, sizeof(str), stdin)。但这两个函数都会把换行符读进来所以统计前记得把末尾的\n去掉否则总数会永远多1。小技巧字符串题目里如果遇到“去掉首尾空格”“忽略大小写”这类要求先别急着写复杂的逻辑直接用C的STL比如transform转小写或者C语言里的tolower函数能在很大程度上降低出错率。基础阶段用工具函数并不可耻反而是高效解决问题的好习惯。4. 常见问题与排查技巧实录4.1 我两次在“多组输入”上栽跟头的复盘我自己第二次刷题时曾经在一道看起来极其简单的题目上连续WA了五次。题目说输入多组数据但我只写了scanf(%d, n)结果第一次测试通过第二次就出问题。后来发现原来题目虽然写了多组数据但第一行会先给一个总数T然后再给T组数据。这种写法在ACM竞赛里很常见学名叫“T组测试用例”代码结构应该是int t; scanf(%d, t); while (t--) { // 处理每组数据 }这个模式和“读到EOF为止”的模式经常混在一起考所以读题时一定要分清楚题目给的是明确的“测试用例数量T”还是“直到输入结束”。这两种模式的处理框架完全不一样前者用while(t--)后者用while(scanf(...) ! EOF)。4.2 排查Presentation Error的三种手法如果你提交后看到的是PE而不是WA说明逻辑基本正确只是输出格式有细微偏差。我的排查顺序是第一步检查每行输出末尾是否有空格特别是行尾多了一个空格这种情况肉眼很难发现但OJ很容易报PE。第二步检查是否为每个输出之间多打了一个空行。题目如果要求“每组输出后跟一个空行”那你输出完每个结果后都要加一个\n但有些选手会在最后一组后面也多输出一个空行这就要看题目是否允许末尾有多余空行。保守做法是“末尾不空行”除非题目有特殊说明。第三步用二进制方式查看输出文件把样例输出的回车符和你的输出进行比对。Linux下可以用cat -A output.txt看到每一行的末尾符号Windows下也可以用支持显示空白字符的编辑器。4.3 编译错误信息完全看不懂怎么办很多新手一看到编译错误就慌其实编译器的每一条报错都有固定套路。比如expected ; before }基本就是前面少了个分号undeclared identifier说明变量没有定义或者拼写错了。最高效的排查方式是先看报错行号的“前一行”因为编译器经常在真正出错的位置之后才反应过来并报错。另一个实用方式是不要把代码写完再编译而是写几行就编译一次。尤其是新手阶段代码量不大完全可以每写完一个步骤就gcc -c main.c检查语法这样可以避免最后一堆报错交织在一起不知道从哪里查起。4.4 关于超时TLE的一个误解基础OJ里很少遇到TLE但一旦出现很多人第一时间会怀疑自己的算法不够高级。实际上第二天的题目如果TLE绝大多数问题出在输入输出函数上。C的endl除了换行以外还会强制刷新缓冲区用多了会严重拖慢程序C语言的printf和scanf虽然快但如果用%d来读long long类型也会导致未定义行为。我在04到06这个阶段曾经遇到过一道排序题没错06题有时候会让你排序我用了cin和cout但忘了关闭同步结果TLE。解决办法是在main函数开头写一句ios::sync_with_stdio(false); cin.tie(0);这个小开关可以让C的输入输出速度快到接近C语言的水平。别看这一行字不起眼它是我从一个老学长那儿学到的刷题保命技能。5. 赛后总结与下一步规划参考5.1 整理一份属于自己的“错题本”04到06题做完优先级最高的不是继续刷07而是回头把这三道题的代码翻出来复盘自己的第一次提交和最终通过的版本差在哪。我习惯用表格记录每道题的踩坑类型题号错误类型具体原因教训04格式错误输出多了一个空格严格按题目原文复现输出05答案错误sum初始化位置不对注意变量的作用域和生命周期06运行时错误数组越界字符串数组长度要预留结束符位置这样记录几次之后你会发现自己常见的错误类型其实很集中。第三四天再刷题时完全可以带着这份“清单”来做题每写完一步就对照检查一遍正确率会有质的提升。5.2 如何科学地进入第三天的题目如果你第二天提前完成任务不用急着往前赶可以把剩下时间拿来“反向出题”把这三道题改成另一道相似的题目比如把“两数之和”改成“三个数求和”把“统计数字出现次数”改成“统计字母出现次数”。这个操作听起来有点绕但它是非常高效的思维训练能逼着你理解题目背后的核心结构而不是死记代码套路。5.3 几个适合第二天的免费OJ资源建议热词里反复出现的杭电OJ、东方博宜OJ和华为OJ其实各有侧重。杭电OJ的题库最全适合按题号顺序刷东方博宜OJ的题目分类更细适合查漏补缺如果你的目标很明确是某个特定方向华为OJ的往期题目就更有参考价值。我的建议是主刷一个平台以另外两个平台做补充。比如主刷杭电OJ的基础100题遇到某个知识点掌握不透的时候去东方博宜OJ搜索相应分类题目做“同类强化”。这种交叉刷题的方式比在一棵树上死磕要轻松很多而且能有效避免“只见过一种考法”的盲区。提示注册账号后第一时间去设置里把语言默认改成自己用的语言C或C否则一些OJ会默认用Java编译你的C代码报出一堆莫名其妙的错误。这个小细节曾经劝退过不少新手。6. 写在最后的一点过来人经验第二天的基础OJ题从难度上说并不夸张但它真的是一个很好的“照妖镜”能照出你读题是否仔细、变量初始化是否规范、对输入输出流的理解是否到位。我见过很多刷题热情很高的人第一天猛刷十道第二天却因为一道格式错误折腾两个小时然后开始怀疑自己是不是不适合这条路。其实绝大多数情况下不是你不适合而是还没建立起“把题目要求当成唯一标准”的意识。我个人在实际操作中的体会是OJ刷题前期的进步不是线性的你可能连着两天感觉都在原地踏步但第三天突然就会顺手很多。这份“手感”来源于前面累计的每一个小习惯比如读题时圈出数据范围、写循环前先确认结束条件、代码里善用计数器变量。如果你能坚持把这个习惯带到后面更复杂的题目里一定会感谢现在耐心琢磨基础题的这个晚上。

相关新闻

厂房焊接车间智能照明改造:照明节能控制系统人体感应方案

厂房焊接车间智能照明改造:照明节能控制系统人体感应方案

焊装车间是汽车工厂中照明设计最复杂的场景之一。焊接作业时弧光强烈,而检验工位又要求极高照度——两者对灯光的需求完全不同。据《乘用车工厂焊装车间照明节能设计的探讨》披露,一汽大众华北生产基地焊装车间在照明施工中出现了“车间一般照明中灯具被…

2026/9/24 19:34:04 阅读更多 →
django-allauth 集成 Kakao 登录:OAuth2 配置指南与源码解析

django-allauth 集成 Kakao 登录:OAuth2 配置指南与源码解析

django-allauth 集成 Kakao 登录:OAuth2 配置指南与源码解析 【免费下载链接】django-allauth Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication. &…

2026/9/24 19:34:04 阅读更多 →
Flink+Hudi实时数据湖入湖实践:从环境搭建到性能调优

Flink+Hudi实时数据湖入湖实践:从环境搭建到性能调优

前阵子在做一个实时数据湖的改造,Kafka 里的业务变更数据要实时落到 Hudi 表,下游再用 Presto 和 Spark 做分析。选型的时候没怎么犹豫就定了 Hudi Flink。用到今天,这套组合在线上已经稳定跑了快半年,中间踩过不少坑&#xff0c…

2026/9/24 19:34:04 阅读更多 →

最新新闻

CC Switch:AI编程工具配置交换机,从原理到报错排查实战

CC Switch:AI编程工具配置交换机,从原理到报错排查实战

1. 我为什么受够了反复改配置文件:CC Switch 要解决的场景 先聊一个很现实的痛点。做 AI 编程工具链的人,电脑里多半不止一套配置:Codex CLI 里写一个 OpenAI 的 key,Claude Code 里又挂一个 Anthropic 的 key,本地还在…

2026/9/24 20:12:34 阅读更多 →
SSM+JSP驾校收支管理可视化平台:毕业设计完整实现指南

SSM+JSP驾校收支管理可视化平台:毕业设计完整实现指南

简介:面向Java毕业设计及SSM框架学习者,这份驾校收支管理可视化平台项目覆盖管理员、学员、教练、财务四个角色,实现学员管理、教练分配、学习计划、车辆维护、考试安排、缴费支付、招生宣传等典型功能。基于SSMJSP架构,B/S模式搭…

2026/9/24 20:12:34 阅读更多 →
CC Switch:统一AI编程工具工作流的本地代理,告别逐工具配置模型

CC Switch:统一AI编程工具工作流的本地代理,告别逐工具配置模型

用过几款 AI 编程工具之后,你大概率会陷入一个有点尴尬的境地:每个工具都内置了模型入口,但模型切换、供应商配置、上下文管理却各搞一套。本地好几个终端工具、IDE 插件,每一处都要单独配一遍 API Key,换模型的时候又…

2026/9/24 20:12:34 阅读更多 →
AI技能版本锁实测:用Skillbox终结技能漂移

AI技能版本锁实测:用Skillbox终结技能漂移

最近大半年我一直在折腾AI Agent相关的工程化落地,其中一个让我头疼到失眠的问题就是:技能漂移。明明昨天跑得好好的一个AI技能,今天队友更新了一下底层依赖,或者某个配置项被人随手调了一笔,整个输出风格和行为逻辑就…

2026/9/24 20:12:34 阅读更多 →
Trae IDE Skill 实战:从原理到手写,让 AI 编程效率翻倍

Trae IDE Skill 实战:从原理到手写,让 AI 编程效率翻倍

如果你已经用 Trae IDE 写了一阵子代码,大概率会有这种体验:Tab 补全和对话补全都不错,但让它干点稍微复杂的活——比如梳理整个项目结构、统一代码风格、把一坨旧逻辑迁到另一个框架——它就表现得像个什么都懂的大聪明,看起来样…

2026/9/24 20:12:34 阅读更多 →
本地私有RAG从零搭建全复盘:架构选型、文档切块与向量化实践

本地私有RAG从零搭建全复盘:架构选型、文档切块与向量化实践

1. 为什么做本地私有RAG,以及这篇复盘会讲什么最近我花了两周时间,从零搭了一套“本地私有RAG”出来。起因其实特别朴素:公司内部有一堆产品手册、FAQ、解决方案文档,散落在各个共享盘和协作工具里,业务同事每次找资料…

2026/9/24 20:11:33 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →