简介这份资料包面向刚开始接触北大POJ在线评测、需要夯实算法基础并查找参考实现的ACM入门者汇集了题号跨度较大的一批基础题目C解答可用于刷题后的思路对照、编译验证与查漏补缺。压缩包共157个文件其中156个cpp源码文件另含1个txt文件大小约59KB体量轻便适合按题号检索后逐个编译运行观察输入输出处理与边界条件。已有2654人学习下载说明其在基础题练习场景中具有一定参考价值。cpp源码覆盖模拟、枚举、字符串处理、简单数论、贪心与基础图论等常见入门题型能帮助读者理解题意转化、代码组织与常见坑点txt文件便于快速浏览包内题目清单或说明。整体适合作为POJ基础题阶段的对照材料建议结合独立实现与调试过程使用。1. 先搞懂一件事一份「基础题答案集」到底是干什么用的很多人第一次听到在线评测平台第一反应是「那是打算法竞赛的人玩的东西吧」。其实不是。你可以把它想成一本会自己批改的练习册你写一段程序交上去它拿几十组事先准备好的数据挨个喂给你的程序全跑对就回你一个「通过」跑错就把那组数据原样打回来。入门题库就是这本练习册最前面的那几十道基础题目而一份整理好的基础题答案集等于有人把参考答案按顺序抄好、摆在你随手能翻到的地方——不是让你抄是让你卡住的时候有个对照。2. 为什么零基础更该从基础题开始别一上来就啃难题新手最常见的心态是「我先看几本算法书看懂了再来做题」。这条路听起来稳实际上十个人里有八个卡在第三章就放弃了。基础题的价值恰恰在于它小到你能在一小时内从头做完一遍而做完一遍带来的反馈比看十页书强得多。2.1 基础题练的是把想法变成能跑的代码算法书讲的是「怎么想」基础题练的是「怎么把它写出来」。这两件事之间的差距比大多数人以为的大得多。举个具体的书上看完「循环累加」只要三十秒但真让你写一个「读入若干个数输出它们的和」你立刻会遇到一堆书上没讲的问题——数据是一组还是多组组数在不在输入里数字大到什么程度、int够不够装每个结果后面要不要换行这些细节没有一处是「算法」但每一处都能让你的程序被判错。一份基础题答案集能帮你把这些细节一次性看全。你写完自己的版本翻到答案对照发现对方用了while (scanf(...) 2)而你是直接scanf一次——你就知道「哦原来这题有多组数据」。这种认知是撞出来的不是读出来的。我第一次接触这类题目的时候一道读入十个数求最大值的题交上去连着三次被判错。最后发现问题不在逻辑而在我把输出写成了printf(%d, max)题目要求每个结果单独一行我漏了换行符。那件事之后我养成了一个习惯任何一道题先把「输入长什么样、输出长什么样」抄在纸上。这个习惯比多背两个算法管用得多。2.2 一份答案集的正确用法对照不是抄先说清楚一件事直接抄答案提交除了浪费自己的时间没有任何收益。评测平台只会告诉你「通过」或「不通过」它不会因为你抄对了就让你变强。正确的用法是三步对照。第一步自己先写哪怕写得很难看、很笨拙也要写完并提交一次拿到一个真实的结果。第二步无论对错都翻答案重点看三处输入是怎么读的、边界是怎么处理的、变量的类型选的是什么。第三步把答案合上凭记忆重写一遍中间卡住就再看一眼直到能一次写完。这个流程慢但它是唯一真正把「看过的」变成「会写的」的办法。抄一遍答案只需要两分钟重写一遍可能要二十分钟但这二十分钟才是你在长本事。2.3 新手第一周该练到什么程度不用给自己定「一天十道」这种目标入门阶段质量远比数量重要。第一周比较现实的目标是这样能把最基础的输入输出题独立做完能分清「单组数据」和「多组数据」两种写法能看懂评测结果里最常见的四五种反馈分别是什么意思遇到判错时知道先去看输入格式而不是怀疑人生。按这个节奏一天两三道题就够了剩下的时间用来对照答案和重写。等你连续十道题都能一次通过再往下走循环、数组、字符串这些内容会顺很多。反过来如果第一周就急着刷三十道很可能每道都是抄过去的第二周回头看还是什么都不会。3. 第一步怎么迈从看题到提交的完整流程这一章带你把一道最基础的题目从头跑通。整个过程不需要安装什么复杂的环境一台能装编译器的电脑就够。3.1 先别急着写代码把题目读三遍新手翻车最多的地方不在代码里在题目描述里。我建议每道题都读三遍每遍看不同的东西。第一遍看故事搞明白这题在让你算什么。第二遍看输入格式和输出格式一个字一个字地看有几个数、什么类型、多个数字之间是空格还是换行、结果要不要带小数位、多组数据怎么分隔。第三遍看样例把样例输入自己手动算一遍算出来的结果和样例输出对得上说明你真的读懂题意了。这三遍花不了五分钟但能省掉后面半小时的调试。3.2 第一个例子两数相加从头跑一遍拿最经典的入门题练手读入两个整数输出它们的和。这道题几乎所有在线评测平台都放在第一位就是因为它把「读入—计算—输出」这条最小链路完整走了一遍。先建一个文件命名随意比如aplusb.c然后把下面这段敲进去。#include stdio.h int main(void) { int a, b; // scanf 的返回值是成功读到的变量个数这里期望是 2 // 用 while 包起来是为了应对「多组数据直到文件结束」的输入形式 while (scanf(%d %d, a, b) 2) { printf(%d\n, a b); // 每个结果单独占一行 } return 0; }这段代码只有十几行但每一行都有讲究。int a, b;声明两个整型变量题目说两个整数用int就够不用想太多。scanf(%d %d, a, b)负责读入两个%d对应两个整数是取地址初学阶段记住「scanf里的变量前面必须加」这条就行漏了它会直接崩溃。printf(%d\n, a b)里的\n是换行很多题目要求「每个结果占一行」漏掉它就是判错。外面那层while是最容易被忽略的。它的意思是只要还能成功读到两个数就一直读下去、算下去。因为很多入门题的输入是「一直给数据直到文件结束」你不知道到底有多少组所以不能用固定的循环次数。如果你确认真的是单组数据代码可以简化成下面这样#include stdio.h int main(void) { int a, b; scanf(%d %d, a, b); // 只读一组 printf(%d\n, a b); return 0; }两个版本的差别就在那个while。判断该用哪个看题目里有没有「多组数据」「输入包含若干组」这类字眼。拿不准的时候用带while的版本更保险——单组数据它也能正确处理读完一组之后读不到第二组循环自然就结束了。写完代码在本地编译运行一下。Linux 或 macOS 的终端里可以这样敲gcc aplusb.c -o aplusb -Wall # -Wall 打开警告能提前发现不少低级问题 ./aplusb # 运行然后手动输入 1 2 回车输入1 2加回车屏幕上应该出现3。再输入100 200回车应该出现300。这两步都对说明程序在本地没问题了可以提交。提交的时候把整段代码复制到平台的代码框里语言选 C点提交。几秒之后你会看到一个结果通常是一个绿色的「通过」或者缩写AC。3.3 看懂判题结果AC、WA、TLE 分别意味着什么提交之后系统回给你的那个缩写是新手最先需要认全的东西。它的作用相当于体检报告看懂了才知道下一步该改哪。结果缩写全称含义通俗解释你该做什么ACAccepted全部数据都跑对了收工去看下一题WAWrong Answer有数据算出来的结果不对检查逻辑和边界情况PEPresentation Error结果对格式不对检查空格、换行、小数点TLETime Limit Exceeded跑得太慢超时了换更省时间的写法MLEMemory Limit Exceeded内存用超了检查是不是开了超大数组RERuntime Error程序运行中崩了多半是数组越界或除零CECompile Error编译没通过看编译器给的行号和提示这张表里新手最常遇到的是 WA 和 PE。PE 其实是最好办的因为你的答案已经对了只是格式不对——最常见的就是多输出了一个空格或者该换行的地方没换行。遇到 PE把输出语句里的空格和\n一个一个核对题目要求就行。WA 麻烦一点因为系统不会告诉你哪组数据错了。这时候有两个自救办法一是自己造几组极端数据比如零、负数、最大值看看程序会不会出错二是把中间变量打印出来看看算到哪一步开始不对。这个「打印中间结果」的习惯是排查问题时最朴素也最好用的手段。4. 拿到答案之后怎么用把看懂的变成写得出的答案集真正的价值在「对照」这个动作上。这一章讲怎么对照才有效以及几类基础题的通用套路。4.1 三步对照法先自己写再比对最后默写这个流程前面提过一次这里展开说清楚每一步具体做什么。第一步自己写。规定一个时间上限比如二十分钟到点还没写出来就先停手去看答案。不要死磕两个小时入门阶段卡太久只会消耗信心。第二步比对。把答案和自己的代码并排打开找差异点。差异通常集中在三个地方输入是怎么读的一次读一个还是一次读一组、循环是怎么组织的谁在外面谁在里面、变量的类型选得够不够大该用long long的地方用了int。找到差异之后别急着下结论说「答案这么写更好」先想一遍「它为什么必须这么写」想不通就把那一段单独拿出来测试。第三步默写。合上答案从空白文件开始重写。这一步是整套流程里最痛苦的也是最有效的。写到卡壳的地方可以瞥一眼瞥完接着写直到能完整跑通。4.2 三类基础题型的套路拆解入门题库里的题八成以上能归到三类里输入输出类、循环累加类、数组处理类。每一类都有一套固定套路认熟了就能省掉大量琢磨时间。输入输出类最典型的就是前面那道两数相加。这类题考的不是思维是你对格式的敏感度。套路只有一条把题目里的输入格式抄下来一个符号一个符号地对着写scanf。循环累加类的代表是「读入 n 个数求和」这种。下面这段代码处理的是「先给数据组数每组里先给个数再给具体数值」的形式#include stdio.h int main(void) { int t; if (scanf(%d, t) ! 1) return 0; // 先读入数据组数读不到就直接退出 while (t-- 0) { // 循环 t 次每次处理一组 int n, x; long long sum 0; // 用 long long防止累加结果超出 int 范围 scanf(%d, n); // 这一组里有 n 个数 for (int i 0; i n; i) { scanf(%d, x); // 一个一个读进来 sum x; // 累加到总和里 } printf(%lld\n, sum); // long long 对应的格式符是 %lld } return 0; }这段代码里有三个值得记住的点。while (t-- 0)是一种常见的计数循环写法每循环一次t减一减到零就停等价于「执行 t 次」。long long sum 0;里的类型选择很关键如果这 n 个数每个都接近十亿int装不下它们的和结果会悄悄变成一个负数而你完全看不出哪里错了。%lld是long long专用格式符用成%d会打印出乱七八糟的值。数组处理类的题套路是「先把数据全读进数组再从头到尾扫一遍」。这类题常见的坑是数组开得太小。入门阶段建议直接把数组开到比题目上限大十个位置比如题目说最多一千个数你就开int a[1010];。多开几个位置不会有人扣你分开小了导致越界才会让程序崩得莫名其妙。4.3 给自己建一个错题本这件事听起来老派但确实有用而且不用很复杂。建一个纯文本文件每次被判错就记三行题目大意一句话、错在哪一句话、正确做法一句话。比如「求最大值输出漏了换行PE」「两数相加只读了一组WA」「求和int溢出改成long long」。积累到二三十条之后你会发现新手犯的错高度重复来来回回就那么七八种。错题本的作用就是让你在犯第三次之前想起来「这个我记过」。5. 新手最容易踩的坑五个当场就能改掉的毛病这一章列的五条全是我自己和身边人真实栽过的。每条按「看到什么现象—为什么—怎么改」的顺序写遇到对应情况可以直接对号入座。5.1 输入读不对导致的连环判错现象本地跑样例完全正确一提交就是 WA改来改去还是 WA。原因本地你只测了样例那一组数据而平台的测试数据里可能有空行、有多余空格、有文件末尾没有换行符的情况。用scanf读数字一般不怕这些但如果你用了gets或者混用了scanf和getchar就很容易读到意料之外的字符。解决把输入方式统一成scanf不要在一份代码里混着用多种读入函数。另外在本地测试时故意在数据中间多敲几个空格、末尾不加换行看看程序还能不能跑对。能扛住这些的程序提交后翻车的概率会低很多。5.2 数据类型选小了结果悄悄变成负数现象逻辑怎么看都对小数据测试也对一交上去就 WA而且错的那组数据往往比较大。原因int能表示的范围内两个大数一加就可能溢出。溢出不会报错它会安静地绕一圈变成一个负数或者一个很小的正数你的程序照样输出只是答案错了。这是最典型的「黑匣子」式错误——没有任何提示只能靠你自己想到。解决看到题目里出现「和」「乘积」「累加」这类字眼先看一眼数据范围。如果单个数字已经到十的九次方累加就一定得用long long。宁可全部用long long也不要在这上面省事。5.3 输出格式差一个空格就全盘皆输现象结果明显是对的但系统一直判 PE甚至直接判 WA。原因很多题目对输出格式要求到「一个空格都不能多」的程度。常见的情形是「两个数之间用一个空格隔开最后一个数后面不能有空格」而大多数人的循环写法会在最后也多打一个空格。解决把「第一个数单独输出后面的数前面加空格」这种写法记下来遇到这类题直接套。另外提交前一定把样例输出复制出来和自己的输出逐字符比对一遍肉眼看不出来就数一下空格个数。5.4 一看不会就翻答案翻完还是不会现象答案集翻得很熟每道题的解法都能看懂但让自己从空白文件开始写还是写不出来。原因看懂和写出是两种能力。「看懂」只需要你跟着别人的思路走一遍「写出」要求你在没有路标的情况下自己搭出整条路径中间任何一个细节卡住都写不下去。解决给自己定一条硬规矩——每道题看完答案之后必须从空白文件重写一遍写不出来就说明还没真会。这条规矩执行起来不舒服但它是把「看懂」转成「会写」的唯一通道。5.5 卡一道题卡一下午把热情耗光现象刚开始兴致很高某天遇到一道怎么都过不去的题从那以后就不想打开了。原因入门阶段遇到的很多卡点其实不是能力问题是缺一个提示。硬扛两个小时不仅解决不了问题还会让人产生「我是不是不适合」的自我怀疑这种情绪上的损耗比时间损耗严重得多。解决给每道题设一个时间上限比如三十分钟。到点还没思路就去看答案看完把关键的那一句记进错题本然后接着做下一题。入门阶段的目标是「持续做下去」不是「每道题都独立攻克」。等基础扎实了再回头挑战那些当时放下的题你会发现它们没那么难。6. 下一步学什么从基础题走到能独立做题的路线基础题刷到一定量之后很多人会突然不知道该往哪走。我的建议是按下面的顺序推进每一阶段都以前一阶段能稳定通过为前提不要跳。阶段主要练什么判断可以往下走的信号第一段输入输出、简单运算连续十道题能一次提交通过第二段循环、条件判断、累加累乘遇到多组数据能自己判断该用哪种读法第三段一维数组、字符串处理能自己想到「先存下来再处理」这种思路第四段排序、查找、简单模拟看到题目能大致说出的步骤再动手写第一段到第二段之间最容易出的问题是急躁。很多人做完几道输入输出题就觉得「太简单了」直接跳去啃复杂算法结果在第三段卡住回头还得补循环的基本功。稳一点走反而快。第二段是打地基的阶段重点练两件事把一个问题拆成几步以及把每一步翻译成代码。这个能力练出来了后面学什么都只是往工具箱里加工具。到第三段你会开始遇到「一道题要写四五十行」的情况。这时候建议养成一个习惯先在纸上写步骤写完再打开编辑器。直接在编辑器里一边想一边写很容易写着写着就乱了最后自己都看不懂自己的代码在干什么。最后一件事关于怎么用这份答案集。我自己的教训是刚开始那阵子我把它当成「不会就翻」的救急包结果翻了两个月独立做题的能力几乎没长。后来我改成每道题都先硬写一遍、提交一次、拿到真实结果之后再去对照同样的题量进步速度完全不一样。从那以后我每次打开答案之前都强制自己先交一次——哪怕明知道是错的。错的那一次提交记录比正确答案本身更能告诉我卡在哪。希望帮到你从今天的第一道题开始就行。本文还有配套的精品资源点击获取