在线判题平台入门题库题解:零基础刷题到Accepted

发布时间:2026/10/31 19:18:33
在线判题平台入门题库题解:零基础刷题到Accepted

简介:面向准备北京大学POJ在线评测与ACM算法入门/进阶练习的学习者,这份题解代码合集覆盖从1000余号到3600余号的大量基础与常见题目,可作为刷题后的对照参考与思路校验材料。压缩包共157个文件,以156个cpp源码为主,另含1个txt说明文件,整体约59KB,体量轻便,便于按题号检索和本地编译验证。已有2653人学习下载,说明其在POJ刷题群体中有一定参考价值。读者可从中获得不同题目的C++实现样例,用于比较边界处理、输入输出格式、基础数据结构与常见算法写法,也可在卡题时定位可运行代码并复盘思路;源码按题号命名,适合配合原题逐个测试和整理自己的模板。

1. 先搞懂一件事:在线判题平台到底是怎么判你输赢的

很多人第一次打开在线判题平台,看到满屏英文题面和 Accepted、Wrong Answer 这类缩写,还没开始就先发怵,以为自己水平不够。它其实就是一个自动批改程序:你把代码交上去,后台拿几组准备好的数据喂给你的程序,输出和标准答案逐字符比对,对得上就给绿灯,对不上就给你一个错误代号。这份入门题库的题解集合,收的就是这类平台上最基础的一批题目,把能跑通的参考写法整理在一起,让新手不至于卡在第一页就放弃。它适合刚学完一门语言的变量、循环、判断,却不知道拿什么练手的人,也适合想补一补基本功的转行者。你不需要先懂算法,先学会“读题—写代码—提交—看结果”这条闭环就够了。

2. 为什么零基础也该早点刷题:三个越晚越吃亏的理由

刚开始学编程的人常有个错觉:语法书看完了、视频课刷完了,就等于会了。真到要自己写一个能跑的小程序,却发现连“从键盘读两个数、加起来打印出来”都要卡半天。刷题解决的正是这个断层——它把“学过的语法”逼成“能用的技能”。这一章先讲清楚为什么值得花时间,再讲第一个具体动作怎么落地。

2.1 语法看完不会写,缺的其实是输入输出这一环

绝大多数入门课把重心放在语法结构上,变量怎么声明、循环怎么写、函数怎么定义,讲得很细。可真实程序的第一句话往往是“从外面拿数据进来”,最后一句往往是“把结果送出去”。这两件事在课堂练习里经常被简化成一句注释,到了判题平台上却成了硬门槛:数据从哪读、读到什么时候停、每个结果之间要不要空行,全是必须自己判断的。我带过的新人里,卡在第一个题目上的人十个有八个不是不会算加法,而是不知道while (cin >> a >> b)里的循环什么时候结束。这类问题看书看不出来,只有真提交一次、被平台打回来一次,才会长记性。

所以第一个建议很朴素:别等“学完算法”再刷题,学完基本语法就去。你不需要会排序、会递归,能写循环和判断就够了。入门题库里前几十道题基本都在练同一件事——怎么把输入吃进来、怎么把输出吐出去、格式怎么摆对。把这一环练顺,后面学任何算法都是在它上面加东西。

2.2 判题平台是最好的免费陪练:它不会安慰你

自己写代码最大的问题是没人给你打分。跑出结果了,对不对?边界情况考虑了吗?数据量放大十倍还撑得住吗?这些问题自己很难诚实回答。判题平台的价值在于它完全不带情绪:你的程序输出多了一个空格,它就判格式错误;你的循环多跑了一层,它就给你超时;你数组开小了一格,它就给你运行错误。它不会因为你“思路是对的”就放你一马,也不会因为你“刚学”就降低标准。

这种反馈对新手特别重要。真实开发里 bug 往往藏很久才暴露,而刷题把反馈周期压缩到了几十秒。你改一行、交一次、立刻知道结果,这种高频循环是建立编程直觉最快的方式。我自己的血泪经验是:刚开始那两个月,被平台打回来的次数比写对的次数多得多,但恰恰是那些打回来的记录,让我记住了“数组要按上限再加几个”“多组数据要用循环读”这些以后再也没忘过的细节。

2.3 早期建立的调试反射,能用很多年

刷题刷到一定量,你会形成一套条件反射:看到答案不对,先怀疑边界值;看到超时,先数循环层数;看到运行错误,先看数组下标和除数。这套反射不是背出来的,是被判题结果反复锤出来的。它跟你以后用哪种语言、做哪个方向关系不大,属于底层能力。

具体怎么开始建立这套反射?给你一个可执行的动作:每道题提交之前,先在本地自己造三组数据——最小的一组(比如 0 和 1)、最大的一组(按题面给的上限)、最刁钻的一组(负数、重复值、空输入)。三组都过了再交。这个习惯看起来笨,但它把“碰运气提交”变成了“有依据提交”,你对结果的预期会越来越准。等哪天你能在提交之前就大致猜到会不会过,说明你已经摸到门道了。

3. 上手前备好三样东西:语言、环境、读题习惯

真正动手之前,有三件事值得花半小时理清楚,能省掉后面好几天的折腾。这一章讲的都是准备工作,看着不起眼,但它决定了你第一次提交是顺利通过还是被各种莫名其妙的报错劝退。准备工作做扎实,后面写代码才有心思琢磨思路,而不是一直在跟环境较劲。

3.1 语言怎么选:别在选语言上纠结超过十分钟

新手最常见的拖延方式,就是在“学 C++ 还是 Python”这个问题上反复横跳,一纠结就是一周。给你一个干脆的判断标准:如果你未来想接触更底层的开发、想参加算法类比赛、或者学校课程要求,选 C++;如果你只想先快速体会到“写出来就能跑”的成就感,选 Python。两种语言在这类入门平台上都能提交,基础题目的难度差异几乎可以忽略。

我个人的建议是:先用手上正在学的那门语言,不要为了刷题临时换语言。换语言意味着你要同时对付两套语法和两套报错信息,纯属自找麻烦。等你把基础题刷顺了,想横向对比,再花几天换一门语言重刷前十道题,那时候你会发现自己对“输入输出”这件事的理解突然清晰了很多——因为同样的逻辑,两种语言的写法差别一眼就能看出来。

还有一个小提醒:选定语言之后,把本地编辑器和平台上的语言选项对齐。用 C++ 写的文件就别在提交时选 Python,用 Python 写的就别选 C++。这个错误低级但极常见,而且报错信息往往让人一头雾水,白白耗掉半小时。

3.2 环境:先用最笨的办法把代码跑起来

新手容易在环境上过度投入,装一堆插件、配一堆快捷键,结果一天过去了代码还没写一行。入门阶段最省事的做法是:一个能保存纯文本的编辑器,加上系统自带的命令行编译运行,足够了。C++ 就用g++ 文件名.cpp -o 程序名编译再运行,Python 直接python 文件名.py。不需要集成开发环境,不需要调试器,甚至不需要代码补全——你现阶段写的代码不超过三十行,补全带来的收益远小于折腾环境的成本。

这里给一个最小的验证流程,确保你的环境真的能用:

# 1. 新建一个文件,写入最基础的程序 # 2. 编译(C++ 用这行;Python 不需要编译) g++ hello.cpp -o hello # 3. 运行,手动输入两个数字,回车,看有没有输出 ./hello

如果你能在本地把一个程序跑起来、手动输入数据、看到输出,环境就算备好了。这一步的价值在于:等你提交出错时,你能确定“至少本地是通的”,问题出在代码逻辑或者输出格式上,而不是环境坏了。缩小排查范围,是新手最该学会的技能之一。

3.3 读题:把题目翻译成“输入、处理、输出”三句话

很多新手读题是一目十行地扫过去,看到“求两个数之和”就动手写,结果漏掉了题面里那句“输入包含多组数据,直到文件结束”。判题平台的题目有一个固定结构:它先描述背景,再说明输入格式,最后说明输出格式。真正要抠的是后两段,一个字都不能漏。

我的做法是读完之后,在纸上或者注释里写三句话:输入是什么、我要做什么处理、输出长什么样。比如面对最经典的那道加法题,我会写:

  • 输入:多行,每行两个整数,直到没有更多输入
  • 处理:每行把两个数相加
  • 输出:每行一个结果,行末换行,不加多余空格

这三句话写出来,题目基本就被拆解完了,剩下的只是把中文翻译成代码。如果这三句话里有任何一句你写不出来,说明题面你还没读懂,这时候别急着写代码,回去再看一遍输入格式那一段。翻车最多的地方从来不是算法,是“我以为我看懂了输入格式”。

4. 第一个例子跑通:从空白文件到 Accepted 的每一步

准备工作做完,现在真的动手。这一章把整个过程拆成一步一步,每一步都告诉你为什么这么做、做错了会看到什么。跟着走一遍,你就能完整理解一次提交的来龙去脉。选的是入门题库里最经典的加法题,几乎所有平台的第一题都是它的变体。

4.1 把题面拆成输入输出契约

假设题面是这样的:输入包含多组数据,每组数据占一行,包含两个整数,当读到文件末尾时输入结束;对于每组数据,输出一行,为该两个整数之和。题面很短,但信息密度不低。第一遍读你可能会想“不就是 a 加 b 吗”,但“多组数据”和“读到文件末尾”这两个限定词,决定了你代码里必须有一个循环,而不能只读一次。

这就是新手第一个大坑:只读一次。你本地手动输入一次,看到结果对了,以为大功告成,交上去平台喂了三组数据,你的程序只处理了第一组就退出了,剩下的全被忽略,结果自然是答案错误。所以读题的时候,凡是看到“多组”“若干组”“直到输入结束”这类字眼,立刻条件反射想到循环。

把契约写清楚:输入是未知行数的整数对,处理是逐对求和,输出是逐行打印,不多不少。三句话一写,代码结构就定了——一个外层循环负责吃输入,循环体里做加法、打印。

4.2 写出第一版代码

先给 C++ 的写法,这是这类平台上最主流的语言:

#include <iostream> using namespace std; int main() { int a, b; // cin >> a >> b 在读到文件末尾时会返回假,循环自动停下 while (cin >> a >> b) { cout << a + b << endl; // 每组结果单独一行 } return 0; }

代码不长,但每一行都有讲究。#include <iostream>引入输入输出相关的东西,using namespace std;让你可以直接写cin、cout而不用加一长串前缀。核心是while (cin >> a >> b)这一句:它做了两件事,先尝试从输入里读两个整数,如果读到了,循环体执行;如果读不到了(输入结束),循环就结束。这个写法比你手动数有多少组数据要省心得多,因为平台也不知道会喂多少组。

Python 的写法逻辑一样,但读输入的方式不同:

import sys for line in sys.stdin: # 逐行读取,直到输入结束 line = line.strip() # 去掉行末的换行符 if not line: # 跳过空行,避免拆包时报错 continue a, b = map(int, line.split()) # 按空格切开,转成整数 print(a + b) # 每组结果单独一行

Python 这段代码里,sys.stdin就是一个可以逐行遍历的输入流,for line in sys.stdin相当于“有多少行读多少行”。strip()去掉行末的换行符,split()默认按空格切分,map(int, ...)把切出来的字符串转成整数。中间那个if not line: continue是防坑用的:有的输入末尾带一个空行,不跳过的话split()会切出空列表,赋值给两个变量时直接报错。

4.3 本地自测:先自己喂数据再上交

代码写完,先别急着提交。在本地跑一遍,手动输入几组数据。第一组用最普通的1 2,看输出是不是3。第二组用带负数的-5 3,看输出是不是-2。第三组用大一点的数,比如1000000 2000000,看你用的整数类型撑不撑得住。最后一组故意多输入几行,确认程序是不是每一行都处理了,而不是只处理第一行就退出。

这一步的意义在于把“答案错误”的排查范围提前。你本地全过了还错,那问题大概率在格式;本地就错了,那说明逻辑有洞,先修逻辑。两种情况的处理方式完全不同,混在一起排查会让你怀疑人生。我见过太多新手,样例都没跑就直接交,被打回来之后对着屏幕发呆,不知道从哪下手。

如果本地跑出来的结果和你手算的不一样,别急着改代码,先把中间值打印出来看看。C++ 里临时加一句cerr << a << " " << b << endl;,Python 里加一句print(a, b, file=sys.stderr),把读进来的数打出来。如果读进来的数就不对,问题在输入;如果数对了结果不对,问题在计算。这个二分法能帮你省掉大量瞎猜的时间。

4.4 提交后看到的每种结果分别意味着什么

提交之后,平台会返回一个结果,常见的有这么几种,每种背后指向的问题完全不一样:

结果中文含义通常原因
Accepted通过输出与标准答案完全一致
Wrong Answer答案错误逻辑有洞,或只处理了部分数据
Presentation Error格式错误答案对,但空格、换行不匹配
Time Limit Exceeded超时算法太慢,或读写方式效率低
Runtime Error运行错误数组越界、除零、递归过深
Compile Error编译错误语法问题,或提交语言选错

看到 Accepted 当然最好,但别急着高兴,回头看一眼你的代码有没有多余的调试输出——有些平台对多余输出是宽容的,有些不是,养成提交前清干净的习惯。看到 Wrong Answer,先按 4.3 的方法自查本地数据,再回头看题面有没有漏掉的条件。看到 Presentation Error,几乎百分百是格式问题,去数一数每行之间是不是多打了空格、末尾是不是少了一个换行。

提示:不同平台对“行末空格”的容忍度不一样。稳妥做法是每行输出结束后只留一个换行,不要在行尾加空格,也不要在最后一组数据后面多打空行。

第一次提交被拒太正常了。我建议你把每次的错误结果和原因记在一个小本子上,哪怕只写一行。刷到第二十道题的时候回头看,你会发现自己踩的坑高度重复,而这份记录就是你的个人避坑清单。

5. 新手最容易踩的 5 个坑:现象、原因、解决

这一章把入门阶段最高频的五类问题单独拉出来讲。它们的共同点是:报错信息看着吓人,实际问题很小。提前知道长什么样,遇到时就不会慌。

5.1 提交就编译错误:语言选错或用了平台不认的写法

现象:本地编译得好好的,交上去直接 Compile Error,报错信息指向一些你根本没写过的行。

原因:最常见的是提交时语言选项和实际代码语言不一致,比如写的是 C++ 却选了 C 的编译器,或者写的是 Python 3 的语法却选了旧版本。其次是用了某些平台编译器不支持的特性,比如较新的语法标准。还有一个隐蔽原因是复制粘贴时代码里混进了中文标点,比如全角的括号和分号。

解决:先核对提交页面的语言下拉框,本地用什么就选什么,文件后缀和语言保持一致。如果确认没选错,把代码里的中文标点全部检查一遍,尤其注意从聊天窗口或文档里复制过来的代码。最后再查一下你用的语法是不是需要特定的标准版本,需要的话去掉或者换写法。

5.2 样例过了却是答案错误:只测了样例这一组数据

现象:本地跑题目给的样例,结果一模一样,提交上去却是 Wrong Answer。

原因:样例通常是最普通的一组数据,专门用来让你确认理解没跑偏,它不覆盖边界情况。你的程序在样例上对,不代表在 0、负数、极大值、重复值上也对。更常见的情况是题目要求处理多组数据,你只处理了一组就退出,而样例恰好只有一组,所以看不出问题。

解决:自己造数据。至少要覆盖四类:最小值(0 或 1)、负数、题面给的上限值、以及多组数据连着输入。造完对着手算结果比一遍。如果这几类都过了还错,再去抠题面里那些你没当回事的限定词,比如“结果保留两位小数”“若不存在输出 -1”这类特殊要求。

5.3 答案对了判格式错误:多一个空格少一个换行

现象:你确信自己的结果是对的,平台却给 Presentation Error,或者在某些平台上直接算 Wrong Answer。

原因:判题是逐字符比对的,你多打一个空格、少打一个换行,在它眼里就是错的。新手最常见的两个动作:一是在输出末尾习惯性加了空格,二是每组数据之间多打了一个空行。还有些题目要求“两组输出之间空一行,最后一组之后不空行”,这种要求特别容易漏看。

解决:回到题面的输出格式那一段,逐字读一遍。然后按这个原则写:每行输出只包含结果本身,行末一个换行,行尾不加空格,最后一组数据后面不多打空行。如果你的代码里用了类似cout << a + b << " " << endl;这种写法,把多余的空格删掉。

5.4 数据一大就超时:循环里重复算同一件事

现象:小数据能过,数据量一大就 Time Limit Exceeded。

原因:八成是把重复计算写进了循环。比如每次循环都重新求一遍某个和、每次都从头扫一遍数组、或者用两层循环去处理本该一层循环解决的事。另一个原因是输入输出方式太慢,在数据量大的题目里,逐字符读写会明显拖慢速度。

解决:先估算数据规模。一般平台一秒大约能跑一亿次简单运算,如果你的循环次数超过这个量级,就得想别的办法。然后检查循环体内部有没有可以提到外面的计算——不随循环变量变化的东西,挪到循环外面算一次就够。如果是读写太慢,C++ 可以换成scanf、printf,或者在程序开头关掉输入输出同步;Python 尽量用sys.stdin批量读,别在循环里反复调用慢速的读取方式。

5.5 运行错误:数组开小了或者下标搞混了

现象:Runtime Error,程序直接崩掉,没有任何输出。

原因:数组越界是最主要的一个。题面说数据范围到 1000,你开了 1000 的数组,可如果下标从 1 开始用,最后一个位置就溢出了。其次是除以零,以及递归层数太深把栈撑爆。还有一种情况是读入的数据类型和变量类型不匹配,比如输入是长整数,你用普通整数接,超出范围后行为不可预期。

解决:数组一律按题面上限再多开几个位置,多开不花钱,少开要命。检查下标是从 0 还是从 1 开始,全篇统一。所有做除法的地方,先判断除数是不是可能为零。涉及大数时,把整数类型换成能装下更大范围的那种。改完再按 4.3 的方法本地喂一遍边界数据。

6. 接下来三个月怎么练:一份不劝退的推进路线

入门题库刷完前二十道,很多人会进入一个尴尬期:简单的题觉得没意思,稍难的题又完全没思路,于是慢慢就不打开了。这不是能力问题,是节奏问题。说说我是怎么安排后面的路的,你可以直接拿去用。

第一个月只做一件事:把基础题刷到能盲写。具体标准是,同一道题隔三天再做一遍,不看之前的代码,能在十分钟内写完并一次通过。这个阶段不要追求题量,追求的是“输入输出和格式”变成肌肉记忆。我当时给自己定的量是每天两道,周末补三道,一个月下来大概六十道,覆盖了加法、比较大小、简单循环、字符串处理这几类。

第二个月开始碰需要一点想法的题,比如排序、查找、简单的数学规律。这个阶段的关键动作是:每道题先自己想二十分钟,想不出来再看题解,看完之后关掉题解自己重写一遍。这个“关掉重写”的动作极其重要,光看会给你一种“我懂了”的幻觉,重写才会暴露你到底哪一步没接上。我自己的教训是,第一个月图省事,看完题解就直接抄,结果遇到同类型的题还是不会,白白浪费了两周。

第三个月可以开始按专题推进,一天一个专题,别贪多:

阶段每天投入重点检查标准
第一个月40 分钟输入输出、格式、边界旧题能盲写通过
第二个月1 小时排序、查找、简单数学看过的题解能独立重写
第三个月1 小时按专题集中突破同类题能自己判断用哪种思路

还有一个具体技巧值得单独说:建一个“错题本”,不用很正式,一个文本文件就行,每次被拒就记三行——题目大意、错误类型、真正原因。坚持记一个月,你会发现自己踩的坑就那么几种,反复踩是因为没记。这份题解集合最好的用法也在这里:它不是让你抄的,是让你在自己写完、被拒、想不通之后,拿去对照着看“别人是怎么处理这个输入的”,看完立刻关掉重写。

最后提一句心态。刷题这件事前期进步很快,中间会有一段平台期,感觉怎么刷都没长进,这是正常的。我自己的习惯是,每次提交之前都强制走一遍那三组自测数据,哪怕题目再简单也不跳过。这个习惯救过我很多次,也让我在很长一段时间里保持着对“格式”这件事的敬畏。希望帮到你,慢慢来,第一道题通过的那一刻,后面的路就好走多了。

本文还有配套的精品资源,点击获取