刷题必知:C++题目递交后的各种标识全解析

在 Online Judge(在线判题系统)上刷题时,每次提交代码后,系统都会返回一个状态标识。这些标识就像是“体检报告”,告诉你程序哪里出了问题,或者成功通过。

对于初学者来说,看到 WARETLE 这些缩写可能会一头雾水。这篇文章将为你详细解读每一个标识的含义、常见原因以及解决方法。

📊 评测状态一览表

状态 缩写 含义 常见原因
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> 或对应的头文件
  • 变量名写错(counnt vs count
  • 每条语句结尾忘了分号 ;
  • 使用了 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:代码正在运行和比对答案。

💡 给新手的几点建议

  1. 先看 CE 和 RE:这两个是最容易定位的,评测系统一般会给出具体行号和错误信息。
  2. WA 了不要慌:先检查边界条件(n=0, n=1, 最大值、最小值),然后自己构造简单测试用例。
  3. TLE 了先检查是不是死循环:在代码里加 cout << i << endl; 看输出是否在无限增长。
  4. 善用本地调试:不要在OJ上反复提交去“试错”,先在本地 IDE 中测试通过后再提交。
  5. AC 不是终点:AC 后可以看看别人的代码,学习更优的解法。

📌 总结

你最可能遇到的(按频率) 应对策略
WA 检查逻辑和边界
CE 看编译错误信息,补头文件或修正语法
TLE 降低算法复杂度,优化IO
RE 检查数组越界、除零、递归
MLE 减小数组大小,用vector

希望这篇文章能帮你快速读懂OJ上的各种结果。下次再看到红色 WA 或者红色 TLE 时,别慌,对照着这篇文章一步步排查就好。

祝大家刷题愉快,天天 AC! 🚀