- gf25030 的博客
刷题必知
- @ 2026-5-29 21:46:55
刷题必知:C++题目递交后的各种标识全解析
在 Online Judge(在线判题系统)上刷题时,每次提交代码后,系统都会返回一个状态标识。这些标识就像是“体检报告”,告诉你程序哪里出了问题,或者成功通过。
对于初学者来说,看到 WA、RE、TLE 这些缩写可能会一头雾水。这篇文章将为你详细解读每一个标识的含义、常见原因以及解决方法。
📊 评测状态一览表
| 状态 | 缩写 | 含义 | 常见原因 |
|---|---|---|---|
| Accepted | AC | 通过 | 程序完全正确,通过所有测试点(终极目标!) |
| Wrong Answer | WA | 答案错误 | 算法逻辑有漏洞,或没有考虑边界情况 |
| Compile Error | CE | 编译错误 | 语法错误、缺少头文件、使用了不支持的语法 |
| Runtime Error | RE | 运行错误 | 数组越界、除以0、栈溢出、访问空指针 |
| Time Limit Exceeded | TLE | 超时 | 算法复杂度过高、死循环、输入输出太慢 |
| Memory Limit Exceeded | MLE | 内存超限 | 数组开得过大、递归过深导致栈溢出 |
| Output Limit Exceeded | OLE | 输出超限 | 死循环中不断打印信息,输出了大量无用内容 |
| Presentation Error | PE | 格式错误 | 答案正确,但多了或少了个空格、换行(常见于新手) |
🔍 各状态深入解读
1. ✅ AC (Accepted) - 绿了!
这是最令人开心的状态,意味着你的代码通过了所有测试点。但要注意:AC 不代表你的代码完美无缺。可能测试数据不够强,或者你的代码只是刚好“卡过”了时间/内存限制。建议偶尔看看最优解法,提升自己。
2. ❌ WA (Wrong Answer) - 最常遇见的老朋友
程序运行正常,但输出结果与标准答案不符。
常见原因:
- 算法思路错误
- 没有处理特殊边界(如 n=0, n=1)
- 数据类型溢出(int 不够用却没改用 long long)
- 多组输入时没有正确重置变量
解决思路:
- 自己构造小数据,手动模拟运行
- 在关键位置输出中间变量(调试完成后记得删除)
- 对拍:写一个暴力正确但效率低的程序,与你的程序对比结果
3. 🔨 CE (Compile Error) - 编译器不买账
代码根本没法编译。点击状态详情,编译器会告诉你在哪一行出了什么错。
常见原因:
- 忘了
#include <bits/stdc++.h>或对应的头文件 - 变量名写错(
counntvscount) - 每条语句结尾忘了分号
; - 使用了 C++11/14/17 的新特性但系统默认用旧标准
4. 💥 RE (Runtime Error) - 程序崩溃了
程序在运行过程中异常终止。
常见原因:
| 具体原因 | 示例 |
| :--- | :--- |
| 数组越界 | int a[10]; a[10] = 1;(下标0-9,却访问了10) |
| 除零错误 | int b = 0; int c = 10 / b; |
| 栈溢出 | 递归函数没有终止条件或递归太深(>1e5层) |
| 非法访问 | int *p = nullptr; *p = 5; |
5. ⏰ TLE (Time Limit Exceeded) - 跑得太慢
程序在规定时间内没有跑完。
常见原因 & 优化方法:
- 死循环 → 检查循环条件是否永远为真
- 算法复杂度过高 → 例如数据量 1e5 用了 O(n²) 的冒泡排序,应改用 O(n log n) 的快排或归并
- 输入输出太慢 → 使用
ios::sync_with_stdio(false); cin.tie(0);或者直接用scanf / printf - 无限递归 → 检查递归终止条件
6. 💾 MLE (Memory Limit Exceeded) - 内存不够用
程序占用的内存超过了题目限制。
常见原因:
- 定义了太大的全局数组,如
int a[10000000];(约40MB) - 递归过深且每层都分配了大量栈空间
- 在循环中不断
new但忘了delete(虽然OJ一般会回收,但依然可能超标)
解决方法:
- 减小数组尺寸,使用动态数组
vector - 将递归改为迭代
- 不需要的数据及时释放(或用完即弃)
7. 📤 OLE (Output Limit Exceeded) - 输出太多了
输出了远超正确结果的数据量。几乎100%是死循环里写了输出语句。
8. 📐 PE (Presentation Error) - 就差一点点
答案的内容是对的,但格式不对。这通常发生在新手刚刷题时。
示例:
- 要求输出
1 2 3,你却输出了1 2 3(末尾多了一个空格) - 要求每行一个数字,你却把所有数字写在一行
解决方法: 仔细检查题目要求的输出格式,模仿样例输出。
⏳ 中间的临时状态
在最终结果出来之前,你可能还会看到这些状态:
- Pending / Waiting:你的代码在队列中排队,等待评测机空闲。
- Compiling:评测机正在编译你的代码。
- Judging / Running:代码正在运行和比对答案。
💡 给新手的几点建议
- 先看 CE 和 RE:这两个是最容易定位的,评测系统一般会给出具体行号和错误信息。
- WA 了不要慌:先检查边界条件(n=0, n=1, 最大值、最小值),然后自己构造简单测试用例。
- TLE 了先检查是不是死循环:在代码里加
cout << i << endl;看输出是否在无限增长。 - 善用本地调试:不要在OJ上反复提交去“试错”,先在本地 IDE 中测试通过后再提交。
- AC 不是终点:AC 后可以看看别人的代码,学习更优的解法。
📌 总结
| 你最可能遇到的(按频率) | 应对策略 |
|---|---|
| WA | 检查逻辑和边界 |
| CE | 看编译错误信息,补头文件或修正语法 |
| TLE | 降低算法复杂度,优化IO |
| RE | 检查数组越界、除零、递归 |
| MLE | 减小数组大小,用vector |
希望这篇文章能帮你快速读懂OJ上的各种结果。下次再看到红色 WA 或者红色 TLE 时,别慌,对照着这篇文章一步步排查就好。
祝大家刷题愉快,天天 AC! 🚀