H慧博算法实验室
课程中心›1 学习指南与计算思维›1.1

LESSON 1.1 · 飞书同步

1.1 如何使用课程与在线评测

课程正文由飞书云文档同步,并使用慧博算法实验室的教学样式呈现。

☁ 飞书内容源🌱 适合零基础🔄 自动更新
🤖代码裁判已就位一起完成今天的学习任务

MISSION · 本课任务

学完这一课,你可以做到

  • 知道一节算法课应该怎样学习
  • 理解什么是在线评测系统
  • 看懂一道编程题的基本结构
  • 完成一次代码提交
  • 读懂常见的评测结果
  • 遇到错误时,知道应该从哪里开始检查

🌱 本课适合零基础学习者。暂时不需要记住复杂代码,我们先认识算法学习的完整过程。


1 学习算法,就像训练一位机器人

想象一下,你拥有一台机器人。

你希望它帮你整理书桌,可是机器人不会“自己理解”你的想法。你必须把任务拆成清楚的小步骤:

  1. 走到书桌前
  2. 拿起一本书
  3. 判断这本书属于哪一类
  4. 找到正确的位置
  5. 把书放进去
  6. 重复以上步骤,直到书桌整理完成

程序也是这样。

算法,就是解决问题时使用的一组清楚、有限、可以执行的步骤。

代码,则是我们使用计算机语言写给机器人的说明书。

💡 小秘密 学习编程不是把代码背下来,而是学会把一个大问题拆成一连串可以解决的小问题。

想一想

如果让机器人帮你泡一杯茶,你会怎样给它安排步骤?

可以试着说一说:

  • 第一步做什么?
  • 第二步做什么?
  • 哪些地方需要判断?
  • 什么时候表示任务完成?

当你开始思考这些问题时,其实已经在尝试设计算法了。


2 每节课应该怎样学习

学习算法可以使用五步学习法:

👀 看:读懂今天的问题

先阅读课程中的概念、故事和例子,弄清楚今天要解决什么问题。

阅读时可以问自己:

  • 题目提供了哪些信息?
  • 题目要求我们计算什么?
  • 输入是什么?
  • 输出是什么?

🧠 想:先说出自己的思路

不要一看到代码就立刻复制。

可以先合上答案,尝试用自己的话说出解决步骤。即使想法不完整,也比直接抄写代码更有价值。

⌨️ 写:亲手敲出代码

自己输入代码,才能发现真正不明白的地方。

输入过程中可能出现:

  • 漏写分号
  • 括号不匹配
  • 单词拼写错误
  • 大小写错误
  • 输入输出格式错误

这些错误不是坏事。每解决一个错误,你就多掌握了一种排错方法。

🚦 测:用样例检查程序

写完代码以后,先使用题目提供的样例进行测试。

如果样例通过,再尝试自己设计一些数据,例如:

  • 最小的数据
  • 比较大的数据
  • 两个数相同的情况
  • 答案为0的情况

🔧 改:根据结果寻找问题

程序没有通过时,不要急着把代码全部删除。

正确的做法是:

  1. 阅读评测结果
  2. 检查输入输出格式
  3. 手算一个简单例子
  4. 对照程序的运行过程
  5. 找到问题并修改
  6. 再次测试和提交

🏆 一次没有通过,不代表失败。 每修改一次程序,你都在训练自己的观察能力和推理能力。


3 什么是在线评测系统

在线评测系统通常简称为 OJ。

OJ 是 Online Judge 的缩写,中文意思是“在线评测系统”。

我们可以把OJ想象成一位速度非常快、非常公平的“代码裁判”。

当你提交程序后,它会自动完成下面的工作:

  1. 接收你提交的代码
  2. 检查代码能否成功编译
  3. 使用多组测试数据运行程序
  4. 比较程序输出和标准答案
  5. 检查运行时间与内存使用
  6. 返回最终评测结果

OJ通常不会只使用题目样例进行检查。

它还会使用许多你看不到的测试数据。这些数据可以帮助它判断:你的程序是真的解决了问题,还是只在样例上碰巧正确。

⚖️ 公平比赛 同一道题,每个人的程序都会接受相同标准的检查。OJ不关心代码是不是和老师写得一样,只检查答案、速度和内存是否符合要求。


4 认识一道编程题

一道完整的编程题通常包含以下内容。

题目描述

告诉我们要解决什么问题。

输入格式

说明程序会读入哪些数据,以及这些数据按照什么顺序出现。

输出格式

说明程序最终应该输出什么内容。

数据范围

告诉我们数据可能有多大。

数据范围会影响算法的选择。数据很小时,简单方法可能就够用;数据很大时,就需要寻找更快的算法。

样例输入与样例输出

帮助我们理解题目,也可以用来初步测试程序。

🔍 读题提醒 不要只看样例猜题意。样例只能帮助理解,真正的要求写在题目描述、输入格式和输出格式中。


5 第一次代码任务:计算两个数的和

题目描述

输入两个整数,计算并输出它们的和。

输入格式

一行包含两个整数 (a) 和 (b)。

输出格式

输出一个整数,表示 (a+b) 的结果。

样例输入

CODE
3 5

样例输出

CODE
8

C++参考程序

C++
#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;程序正常结束

跟着数据走一遍

当输入是:

CODE
3 5

程序会依次完成:

  1. 把3存入变量a
  2. 把5存入变量b
  3. 计算a+ba+b
  4. 得到结果8
  5. 输出8

6 提交程序前的检查清单

提交之前,可以完成下面的检查:

✓ 使用了题目要求的编程语言
✓ 提交的是完整程序
✓ 所有括号都正确配对
✓ 每条语句结尾的分号没有遗漏
✓ 输入顺序和题目要求一致
✓ 输出内容和题目要求一致
✓ 没有输出“请输入一个数字”等额外提示
✓ 已经使用样例运行过一次
✓ 样例输出与题目完全一致

为什么不能输出额外提示

下面的写法适合平时演示:

C++
cout << "请输入两个整数:";
cin >> a >> b;

但是OJ只需要最终答案。

如果标准答案是:

CODE
8

而程序输出:

CODE
请输入两个整数:8

OJ会认为两者不同,从而返回答案错误。

因此,提交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。

不同结果对应不同的检查方向。

第二步:检查输入输出

很多错误并不是算法错误,而是格式错误。

例如:

  • 多输出了一句话
  • 少输出了一个空格
  • 把输入顺序写反了
  • 忘记输出最终答案

第三步:手算一个简单例子

选择一组很小的数据,先用纸笔计算答案,再观察程序得到的结果。

第四步:跟踪变量变化

可以暂时在关键位置输出变量:

C++
cout << "a = " << a << ", b = " << b << endl;

找到问题后,要记得删除这些调试输出,再提交OJ。

第五步:检查边界情况

重点考虑:

  • 最小数据
  • 最大数据
  • 结果为0
  • 两个数相等
  • 只有一个元素
  • 数组的第一个和最后一个位置

第六步:修改后重新测试

不要一次修改很多地方。

每次只修改一个明确的问题,然后重新运行,这样更容易判断修改是否有效。


9 可以体验哪些公开OJ

不同平台的页面不同,但基本过程都是:

  1. 阅读题目
  2. 编写程序
  3. 选择语言
  4. 提交代码
  5. 查看评测结果
  6. 修改并重新提交

洛谷

网址:https://www.luogu.com.cn/

中文题目和题单比较丰富,适合算法竞赛学习。

OpenJudge

网址:http://noi.openjudge.cn/

包含多种公开题库,页面结构比较直接。

Codeforces

网址:https://codeforces.com/

国际算法竞赛平台,适合有一定基础后继续挑战。

🔐 安全提醒 未成年人注册公开平台时,应在家长或老师指导下进行。不要公开真实姓名、学校、家庭住址、手机号等个人信息。


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. 阅读课程和题目
  2. 思考解决步骤
  3. 亲手编写代码
  4. 使用样例测试
  5. 提交在线评测
  6. 阅读评测结果
  7. 查找并修改错误

请记住我们的五步学习法:

👀 看 → 🧠 想 → ⌨️ 写 → 🚦 测 → 🔧 改

学习编程不要求每一次都写对。

真正重要的是:遇到问题以后,能够冷静观察、认真思考、找到原因,并继续尝试。

🎉 恭喜你完成第1.1课! 现在,你已经知道怎样使用课程,也做好了挑战编程题目的准备。

本课目录 · 点击展开