
简介杭州电子科技大学在线OJ平台10001099题目的C/C题解包面向正在刷题备赛的学生和希望提升算法能力的程序员覆盖基础算法、数据结构、数学应用、逻辑推理等常见题型尤其适合刚开始接触OJ、需要参考答案对照思路的学习者。压缩包共90个文件以62个cpp和16个c源码为主另含VC6.0工程文件、编译中间文件及可执行程序等辅助内容整体仅1.1MB便于本地编译调试或按题号检索。代码均经过调试通过既能看到AB这类入门题的简洁实现也能看到Max Sum、FatMouse Trade等经典题目的解法涵盖贪心、动态规划、大数处理、图论等知识点可帮助读者理解算法如何落地为C/C代码。已有1835人学习下载无论是初学者模仿编码风格还是有经验的开发者研究优化思路都能从中获得启发。1. 杭电OJ 1000-1099为什么我让你从这段题号开始刷第一次在杭州电子科技大学在线oj杭电OJ上看到 1000-1099 这段题号我以为是单纯的热身题结果自己当年也连续踩了三次 Compile Error。后来带新人刷题我仍然坚持让他们从这段开始题目规模小、输入输出规律强、边界条件直白适合把“在线判题系统到底怎么执行我的代码”这件事彻底搞清楚。它不是给算法高手怀旧用的而是给刚入门 oj 刷题的开发者一个低成本的试错空间——你不需要懂图论或者动态规划只需要把输入输出处理和代码规范练到肌肉记忆。这篇文章就用我在杭电OJ 1000-1099 上跑过的代码模板把提交前的准备、题目套路和最容易翻车的细节一次讲透。2. 把本地代码变成OJ上的Accepted提交前的三件事很多人本地运行正确一提交就红问题往往不在算法而在在线评测系统的执行方式。杭电OJ 和大多数 oj 平台一样评测程序会把你的源码编译后用一组输入文件喂给程序再把标准输出和答案比对。它不会帮你清理缓冲区不会容忍多余空格更不会因为你加了 system(pause) 就放你一马。2.1 选择语言与编译环境C、C还是Java杭电OJ 1000-1099 这段题目绝大部分用 C 语言就能通过。我一般建议新手优先选 C因为这段题号里的输入输出模式最接近 C 的 scanf/printf 习惯。等你处理字符串和结构体觉得繁琐了再切到 C 也不迟OJ接受 g 编译的 C 代码vector、string 都能用但注意不要用到非标准头文件。Java 也能交但有两个硬性要求类名必须是 Main而且不能带 package。我看到过不少同学本地跑得好好的提交后 Runtime Error原因就是类名写成了 public class Test。如果你已经在用 Java 刷题记住杭电OJ 对 Java 的时限通常放得宽但 1000-1099 这类的简单循环别写得太花哨毕竟判题机还要算上 JVM 启动时间。2.2 输入输出处理scanf/printf 与 while(scanf(...) ! EOF)我看过很多新手提交这类代码最常见的问题是只处理一组输入。杭电OJ 1000 这类题目的输入描述写着“每行两个整数”实际评测时会有多行直到文件结束。所以代码模板必须写成循环读取而不是只读一次。#include stdio.h int main() { int a, b; while (scanf(%d %d, a, b) ! EOF) { printf(%d\n, a b); } return 0; }这段代码的逻辑说明scanf 的返回值是成功读取的变量个数当读取不到更多数据时返回 EOF。while 循环会把每一行输入都处理掉每读入一组数据就立即输出一行结果而不是攒到最后一起打印。注意 printf 里的换行符 \n 不能丢格式要求输出一行一个结果少了它会把多个答案粘连到一起。参数上有一个细节scanf 里面“%d %d”中间的空格能吞掉输入行里的空白字符所以不管是 Tab、多个空格还是换行都能正常解析。你要是写成了“%d%d”遇到“1 2”中间的空格会直接读取失败这是很多本地测试没问题、提交却输出异常的元凶。2.3 提交页面的字段OJ参数与代码行为必须一致提交代码时页面一般会让你选语言、粘贴源码有些版本还有“Problem ID”之类的字段。语言必须和你的代码匹配你写的是 C就选 GNU C写的是 C就选 GNU C。选错语言不会导致编译失败但可能出现莫名其妙的链接错误因为有的判题机对 C 和 C 的编译参数不同。代码是直接粘贴文本而不是上传本地 .cpp 文件。这意味着注释里不要写中文没关系但代码文件保存的编码要留意。个别浏览器粘贴时会改变缩进这不影响编译真正要命的是把本地代码里自动生成的头文件路径或者 #pragma comment 一起粘进去这在 oj 平台的编译器上可能直接报 unknown pragma。3. 1000-1099题目的三种套路从AB到字符串别踩坑这段题号看起来题目多实际上归纳下来就三种模式纯 AB 类、带退出条件的循环类、字符串和数组入门类。你把这三种模式的代码骨架记熟遇到类似题目就能往里套而不是每次从零写。3.1 标准AB类多组输入直到文件结束杭电OJ 1000 就是无脑 AB但 1001 这种题会稍微变一下让你算 n 项和而且输入有多组。很多人翻车的点在于不知道多组输入怎么结束或者输出格式要求“每组输出后接一个空行”没注意到。#include stdio.h int main() { int a, b; while (scanf(%d %d, a, b) ! EOF) { printf(%d\n\n, a b); } return 0; }这个模板和上一章的区别在 printf 里多了一个 \n用于满足“每个测试实例输出后跟一个空行”的格式要求。判断条件依然是 EOF只要输入文件还有数据就一直处理。你在本地测试时可以输入几个例子然后按 CtrlC 或者让进程读到文件结尾OJ自动管控输入流长度你不用写任何终止逻辑。参数上要注意printf 用了两个换行符其中第二个换行就是题目要求的空行。如果题目没要求空行别多写这一个否则会被判定为 Presentation Error。3.2 带退出条件的循环遇到特殊值终止很多题目会在开头或结尾给你一组特殊值表示输入结束。比如 1090 这类题输入每行第一个数是 n后面跟 n 个整数n 为 0 时结束。这时候再死等 EOF 就会逻辑错误因为你的程序会去读取已经不存在的数据。#include stdio.h int main() { int n; while (1) { scanf(%d, n); if (n 0) { break; } int sum 0, x; for (int i 0; i n; i) { scanf(%d, x); sum x; } printf(%d\n, sum); } return 0; }逻辑说明先读一个数判断是否为 0是就直接 break 结束整个 while。这不是靠 EOF 结束而是靠题目约定好的哨兵值。循环内部用一个 for 循环读入后面的数据并累加最后输出 sum。要注意先判断再处理顺序反了会把哨兵值当普通数据累加进去。参数上n 的取值范围在题目里会给多数是 int 够用的但求和变量 sum 建议直接用 long long后面我会在避坑章节解释原因。3.3 字符串和数组初体验清空缓冲区与字符读入1000-1099 里有一部分题涉及单个字符和简单字符串处理比如统计字母、反转字符串。这类题目最常见的问题不是算法而是读完数字后立刻读字符串缓冲区里残留的换行符把你坑了。#include stdio.h #include string.h int main() { int t; scanf(%d, t); getchar(); while (t--) { char s[100] {0}; fgets(s, sizeof(s), stdin); s[strcspn(s, \n)] 0; int len strlen(s); for (int i len - 1; i 0; --i) { putchar(s[i]); } putchar(\n); } return 0; }逻辑说明读完整数 t 后输入流里还留着一个换行符如果不先 getchar() 清掉第一次 fgets 读到的就是空串。fgets 会把换行符也读进数组所以用 strcspn 找到换行位置后置为字符串结束符。后面就是按长度从尾部输出字符并补一个换行。参数上s 的数组大小给 100 是对应付一行的保守做法但你在 oj 刷题时最好根据题目给的数据上限设置比如 1000 个字符就开 1001。这里的 100 只是示例代码里不能想当然地固定大小否则隐藏测试数据一长就爆内存越界直接 Runtime Error。4. 杭电OJ 1000-1099常见的五个坑从Compile Error到Time Limit Exceeded这一章我把自己这几年带人刷题看到的高频翻车现场整理成了排查清单每一条都是血泪经验。记下来比多刷二十道题都值。4.1 现象Compile Error错误提示 unknown type name原因把 main 写成了 mian或者漏了 stdio.h 头文件。还有人是把全角括号、中文分号混进去了编译器直接懵掉。解决先把代码复制到本地的 gcc 或在线编译器里过一遍编译。杭电OJ 报错信息里会给出行号照着行号检查。最保险的方法是把常用模板固定下来只改业务逻辑不每次手敲头文件。4.2 现象Presentation Error原因输出的空格、换行和答案有差异。最常见的是题目要求“每组输出之间空一行”你只打了一个换行或者你已经输出了空行但行尾多了一个空格。解决这类错误在杭电OJ 上比 Wrong Answer 轻判题机已经认为答案对只是格式没对齐。你把输出模板改成和题目描述完全一致特别是空行只在指定位置出现不要多打。本地验证时可以用 diff 对照样例输出逐字节看差异。4.3 现象Time Limit Exceeded原因不是死循环而是算法太慢。1000-1099 里不至于让新手做复杂算法但有些人会把求阶层这种题目用递归写而递归每层都有函数调用开销比普通循环慢几个量级。解决能用循环不用递归能预计算就预计算。比如斐波那契数列先算好前 100 项存数组查询时直接取下标而不是每次重新递归。这类题的数据规模很小这个优化足以通过。4.4 现象Wrong Answer本地测试明明对原因整数溢出。我见过有人求 1 到 n 的和用 int 累加n 到一万时已经逼近 int 上限勉强跑对但 oj 的隐藏测试数据可能给到十万、百万int 溢出后结果变负数。解决凡是求和、累乘的变量直接用 long long。C 里 printf 对应改成 %lld。别觉得麻烦这段题号里至少有三四成题目能靠这个改动从 WA 变 AC。另外负数取模的问题也可能在这段题目里出现尽量先调整为正数再运算。4.5 现象Runtime Error提示 stackoverflow 或非法内存访问原因数组越界是最常见的其次是递归深度过大。很多新手习惯把数组长度开成刚好等于输入上限忘了一个字符串结束后还要补 \0多开一位又不会吃亏。解决把所有数组大小在题目上限基础上加一。比如题目说长度不超过 1000你就开 1001。再检查所有循环下标是否可能跑到数组末尾之后特别是用了 strlen 后再去操作 s[strlen] 这种写法的。5. 用本地自动化比对护住输出格式一个降低返工的小脚本这一章不教新算法而是教你用重定向把一个很烦的问题解决掉你改了一次代码要确认没把之前能通过的测试又弄挂。手动一遍遍复制输入输出太费时了我一般这样做。先建一个 input.txt把题目给的样例输入放进去再写一个同样目录下的批处理文件比如用 bashwhile read line; do echo $line done input.txt temp_input.txt ./solution temp_input.txt my_output.txt diff my_output.txt expected_output.txt逻辑说明这段脚本把 input.txt 的内容原样喂给编译好的 solution 程序把输出写到 my_output.txt然后和 expected_output.txt你自己按题目描述整理的期望输出做 diff。diff 没有输出就说明完全一致有输出会逐行标出差异位置。参数上注意 diff 对比的是精确字节包括行尾空格和空行。你要是发现脚本报差异但是肉眼看不出来可以用 cat -A my_output.txt 查看隐藏字符行尾会显示 $多余空格会显示 ^I 或空格字符这样就能定位是不是格式问题。这段题号刷完之后建议顺着往里做先自己跑一下脚本把样例过了再提交。如果 WA就构造边界测试比如输入 0、最大值甚至空行配合这个比对脚本在本地反复验证。我自己从这段题号里最大的收获不是会了几道题而是养成了“拿脚本盯住输出格式”的习惯后面刷复杂算法题时少了很多无谓返工。希望帮到你。本文还有配套的精品资源点击获取