代码提交检查表

为什么又要水一篇踩坑总结呢?

写这篇文章的缘由是我整理luogu/vijos评测记录时发现,有相当一部分的爆零代码根本不是算法写错了啊!都是一些小细节上的失误。然而NOIP并不会管你是不会还是失误,爆零就是爆零。因此有必要做一份交代码前的Checklist,以免你的代码变成 WA/CE/RE自动机 (逃)

NOIp结束前10分钟强烈建议停止写题,认真地核对此检查表。

  1. 程序文件名,后缀(.cpp),文件夹路径是否全部正确
  2. freopen文件输入输出是否全部打开,输入输出文件名是否正确
  3. 调试输出是否全部关闭
  4. 数组大小是否合适,满足题目要求并留有余量
  5. 头文件是否全部包含且正确
    • windows下专用头文件是否已去除
    • 有些考场不让用的头文件(不如ctime)是否已经去除
    • 某些很容易漏的头文件:用了memset就要包含cstring,用了rand就要包含cstdlib
    • windows上测试,不包含头文件是可以编译通过的,Linux评测机上会爆零
  6. 输出格式是否正确
    • Yes/No 或其他英文字符串的大小写是否正确
    • 数据分割方式是换行还是空格
  7. 题目有多组数据的,检查每组数据间:
    • 全局变量是否清空
    • 栈、队列、vector是否清空
  8. 变量、函数命名是否有重复、重复定义,临时变量所用ijkt是否定义过全局变量。有没有踩C++关键字
  9. 检查数据类型,是否存在double/int计算,long long/int计算,或会溢出的计算。这些问题隐藏属性较高。
    • int*int 会溢出,建议用long long
    • abs、sqrt等数学函数返回double,因此不要直接 % 或与int计算。
  10. 有条件切换linux的,去Linux评测一下。因linux对于内存泄漏管理严格,任何越界会强退,避免隐藏错误。

今天只想出这些,以后踩坑了继续添加。

2018.3.25 第一道luogu紫色标签 “省选/NOI-” AC祭

题目:

[NOI2004]郁闷的出纳员

https://www.luogu.org/problemnew/show/P1486

思路:Treap维护所有员工工资数额,堆维护工资上升序列,减工资时弹出堆顶过小的工资,并在Treap中删除。查询时直接用“按排名查询值”模板即可。

提交的代码没有任何问题,本来能一遍AC的,可是阴差阳错CE/WA各一次,第一次treap用随机函数没加cstdlib,第二次没关freopen,第三次直接AC,留下了一点小遗憾。

附一张悲惨的CE/WA评测记录