LESSON 1.1 · 飞书同步
1.1 如何使用课程与在线评测
课程正文由飞书云文档同步,并使用慧博算法实验室的教学样式呈现。
MISSION · 本课任务
学完这一课,你可以做到
- 知道一节算法课应该怎样学习
- 理解什么是在线评测系统
- 看懂一道编程题的基本结构
- 完成一次代码提交
- 读懂常见的评测结果
- 遇到错误时,知道应该从哪里开始检查
🌱 本课适合零基础学习者。暂时不需要记住复杂代码,我们先认识算法学习的完整过程。
1 学习算法,就像训练一位机器人
想象一下,你拥有一台机器人。
你希望它帮你整理书桌,可是机器人不会“自己理解”你的想法。你必须把任务拆成清楚的小步骤:
- 走到书桌前
- 拿起一本书
- 判断这本书属于哪一类
- 找到正确的位置
- 把书放进去
- 重复以上步骤,直到书桌整理完成
程序也是这样。
算法,就是解决问题时使用的一组清楚、有限、可以执行的步骤。
代码,则是我们使用计算机语言写给机器人的说明书。
💡 小秘密 学习编程不是把代码背下来,而是学会把一个大问题拆成一连串可以解决的小问题。
想一想
如果让机器人帮你泡一杯茶,你会怎样给它安排步骤?
可以试着说一说:
- 第一步做什么?
- 第二步做什么?
- 哪些地方需要判断?
- 什么时候表示任务完成?
当你开始思考这些问题时,其实已经在尝试设计算法了。
2 每节课应该怎样学习
学习算法可以使用五步学习法:
👀 看:读懂今天的问题
先阅读课程中的概念、故事和例子,弄清楚今天要解决什么问题。
阅读时可以问自己:
- 题目提供了哪些信息?
- 题目要求我们计算什么?
- 输入是什么?
- 输出是什么?
🧠 想:先说出自己的思路
不要一看到代码就立刻复制。
可以先合上答案,尝试用自己的话说出解决步骤。即使想法不完整,也比直接抄写代码更有价值。
⌨️ 写:亲手敲出代码
自己输入代码,才能发现真正不明白的地方。
输入过程中可能出现:
- 漏写分号
- 括号不匹配
- 单词拼写错误
- 大小写错误
- 输入输出格式错误
这些错误不是坏事。每解决一个错误,你就多掌握了一种排错方法。
🚦 测:用样例检查程序
写完代码以后,先使用题目提供的样例进行测试。
如果样例通过,再尝试自己设计一些数据,例如:
- 最小的数据
- 比较大的数据
- 两个数相同的情况
- 答案为0的情况
🔧 改:根据结果寻找问题
程序没有通过时,不要急着把代码全部删除。
正确的做法是:
- 阅读评测结果
- 检查输入输出格式
- 手算一个简单例子
- 对照程序的运行过程
- 找到问题并修改
- 再次测试和提交
🏆 一次没有通过,不代表失败。 每修改一次程序,你都在训练自己的观察能力和推理能力。
3 什么是在线评测系统
在线评测系统通常简称为 OJ。
OJ 是 Online Judge 的缩写,中文意思是“在线评测系统”。
我们可以把OJ想象成一位速度非常快、非常公平的“代码裁判”。
当你提交程序后,它会自动完成下面的工作:
- 接收你提交的代码
- 检查代码能否成功编译
- 使用多组测试数据运行程序
- 比较程序输出和标准答案
- 检查运行时间与内存使用
- 返回最终评测结果
OJ通常不会只使用题目样例进行检查。
它还会使用许多你看不到的测试数据。这些数据可以帮助它判断:你的程序是真的解决了问题,还是只在样例上碰巧正确。
⚖️ 公平比赛 同一道题,每个人的程序都会接受相同标准的检查。OJ不关心代码是不是和老师写得一样,只检查答案、速度和内存是否符合要求。
4 认识一道编程题
一道完整的编程题通常包含以下内容。
题目描述
告诉我们要解决什么问题。
输入格式
说明程序会读入哪些数据,以及这些数据按照什么顺序出现。
输出格式
说明程序最终应该输出什么内容。
数据范围
告诉我们数据可能有多大。
数据范围会影响算法的选择。数据很小时,简单方法可能就够用;数据很大时,就需要寻找更快的算法。
样例输入与样例输出
帮助我们理解题目,也可以用来初步测试程序。
🔍 读题提醒 不要只看样例猜题意。样例只能帮助理解,真正的要求写在题目描述、输入格式和输出格式中。
5 第一次代码任务:计算两个数的和
题目描述
输入两个整数,计算并输出它们的和。
输入格式
一行包含两个整数 (a) 和 (b)。
输出格式
输出一个整数,表示 (a+b) 的结果。
样例输入
3 5样例输出
8C++参考程序
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << a + b;
return 0;
}程序是怎样工作的
| 代码 | 作用 |
|---|---|
| #include <iostream> | 使用C++的输入输出工具 |
| using namespace std; | 让我们可以直接使用 cin 和 cout |
| int main() | 程序开始运行的位置 |
| int a, b; | 准备两个整数变量 |
| cin >> a >> b; | 读入两个整数 |
| cout << a + b; | 输出两个数的和 |
| return 0; | 程序正常结束 |
跟着数据走一遍
当输入是:
3 5程序会依次完成:
- 把
3存入变量a - 把
5存入变量b - 计算
- 得到结果
8 - 输出
8
6 提交程序前的检查清单
提交之前,可以完成下面的检查:
为什么不能输出额外提示
下面的写法适合平时演示:
cout << "请输入两个整数:";
cin >> a >> b;但是OJ只需要最终答案。
如果标准答案是:
8而程序输出:
请输入两个整数:8OJ会认为两者不同,从而返回答案错误。
因此,提交OJ时不要输出题目没有要求的文字。
7 读懂评测结果
AC:答案正确
AC是Accepted的缩写。
它表示程序通过了全部测试数据。
🎉 恭喜,你成功解决了这道题!
WA:答案错误
WA是Wrong Answer的缩写。
程序可以运行,但是某些结果不正确。
可以重点检查:
- 是否理解错了题意
- 是否遗漏某些情况
- 计算公式是否正确
- 输入输出格式是否正确
- 循环次数是否多一次或少一次
CE:编译错误
CE是Compile Error的缩写。
代码存在语法问题,编译器无法生成可以运行的程序。
常见原因包括:
- 漏写分号
- 括号不匹配
- 单词拼写错误
- 变量没有定义
- 大小写错误
RE:运行错误
RE是Runtime Error的缩写。
程序虽然编译成功,但运行过程中出现了问题。
常见原因包括:
- 数组越界
- 除数为0
- 访问了错误的位置
- 递归层数过多
TLE:超出时间限制
TLE是Time Limit Exceeded的缩写。
程序运行时间太长,需要寻找更快的方法。
MLE:超出内存限制
MLE是Memory Limit Exceeded的缩写。
程序使用了太多存储空间,需要减少不必要的数据。
| 结果 | 中文含义 | 首先检查 |
|---|---|---|
| AC | 答案正确 | 总结自己的解题方法 |
| WA | 答案错误 | 题意、公式和特殊情况 |
| CE | 编译错误 | 语法、拼写、括号和分号 |
| RE | 运行错误 | 数组越界、除以0 |
| TLE | 超出时间 | 算法是否太慢 |
| MLE | 超出内存 | 是否保存了过多数据 |
🕵️ 调试侦探 错误信息不是惩罚,而是OJ提供的线索。优秀的程序员并不是从不出错,而是能够根据线索找到错误。
8 遇到错误时怎样排查
推荐按照下面的顺序检查。
第一步:认真阅读结果
先确认是CE、WA、RE,还是TLE。
不同结果对应不同的检查方向。
第二步:检查输入输出
很多错误并不是算法错误,而是格式错误。
例如:
- 多输出了一句话
- 少输出了一个空格
- 把输入顺序写反了
- 忘记输出最终答案
第三步:手算一个简单例子
选择一组很小的数据,先用纸笔计算答案,再观察程序得到的结果。
第四步:跟踪变量变化
可以暂时在关键位置输出变量:
cout << "a = " << a << ", b = " << b << endl;找到问题后,要记得删除这些调试输出,再提交OJ。
第五步:检查边界情况
重点考虑:
- 最小数据
- 最大数据
- 结果为0
- 两个数相等
- 只有一个元素
- 数组的第一个和最后一个位置
第六步:修改后重新测试
不要一次修改很多地方。
每次只修改一个明确的问题,然后重新运行,这样更容易判断修改是否有效。
9 可以体验哪些公开OJ
不同平台的页面不同,但基本过程都是:
- 阅读题目
- 编写程序
- 选择语言
- 提交代码
- 查看评测结果
- 修改并重新提交
洛谷
中文题目和题单比较丰富,适合算法竞赛学习。
OpenJudge
包含多种公开题库,页面结构比较直接。
Codeforces
国际算法竞赛平台,适合有一定基础后继续挑战。
🔐 安全提醒 未成年人注册公开平台时,应在家长或老师指导下进行。不要公开真实姓名、学校、家庭住址、手机号等个人信息。
10 本课闯关
第1关
OJ的主要作用是什么?
- A. 帮我们自动写程序
- B. 自动检查程序是否正确
- C. 帮我们背诵代码
- D. 自动讲解所有错误
第2关
程序返回CE,最可能表示什么?
- A. 程序运行太慢
- B. 程序答案错误
- C. 代码存在编译问题
- D. 程序已经全部通过
第3关
程序返回WA以后,比较合理的做法是什么?
- A. 立刻删除全部代码
- B. 随便修改几行再次提交
- C. 阅读题目并使用小数据检查
- D. 认为是OJ出现了错误
第4关
为什么不建议直接复制老师的代码?
- A. 复制代码速度太慢
- B. 亲手思考和输入才能发现自己不懂的地方
- C. 老师的代码一定是错误的
- D. OJ不允许提交相同代码
第5关
请用自己的话解释:
- 什么是算法?
- 什么是代码?
- 什么是OJ?
- AC代表什么?
- 遇到错误时应该怎样做?
11 参考答案
- 第1关:B
- 第2关:C
- 第3关:C
- 第4关:B
第5关没有唯一答案。只要能够用自己的语言表达清楚,就说明你已经理解了这一课。
12 本课总结
今天我们认识了算法学习的完整过程:
- 阅读课程和题目
- 思考解决步骤
- 亲手编写代码
- 使用样例测试
- 提交在线评测
- 阅读评测结果
- 查找并修改错误
请记住我们的五步学习法:
👀 看 → 🧠 想 → ⌨️ 写 → 🚦 测 → 🔧 改
学习编程不要求每一次都写对。
真正重要的是:遇到问题以后,能够冷静观察、认真思考、找到原因,并继续尝试。
🎉 恭喜你完成第1.1课! 现在,你已经知道怎样使用课程,也做好了挑战编程题目的准备。