科学调试法

本人卒于 noip2024 T1,故作此文,以示后人。


你现在已经写完一道题的代码了,但你发现自己过不了样例。完全按照下面的步骤依次进行,你大概率可以调出来所存在的问题。

RE

这个比 WA 的情况少得多。

  1. 除以 0。

  2. 数组、STL 等越界。

  3. 栈溢出。

WA

  1. 请先再仔细读一遍题。特别是输入输出部分。

  2. 检查是否是没开 __int128/long long、忘记取模、多测没清空等问题。

  3. 请再读一遍你代码的逻辑。包括:在写的过程中因为觉得没想清楚而 mark 出来的部分、前后相似部分是否又相同逻辑……

  • 过不了的样例规模很小

    • 题意容易用人脑模拟

      用人脑模拟,比对程序哪里出错。

      1. 分步检查。先输出前面一部分的结果,再输出后面的。

      2. (在 DP 之类的题目中)可能原本你的程序是不记录方案的,但是为了更方便地比对,最好输出方案。

    • 题意不易用人脑模拟(如概率、期望、博弈论题)

      1. 检查你推出来的式子是否有问题。

      2. 如果你直接看看不出来,请造一组更弱的、可以用人脑模拟的样例。比如概率题可以取概率为 12,博弈论题取可以用对称法解决的情况云云。

      如果还是调不出来,只有重复 1、2 并检查代码细节问题了。我没有更好的建议了。

  • 过不了的样例规模很大

    1. 检查是否是数组开小之类的问题。

    2. (如果是计数或最优化问题)分析答案是大了 / 小了,猜测是哪里出错了。如果猜不出来、或答案有大有小也没有关系。

    • 过不了(或过了)的样例具有特殊性质:

      1. 先分析一下(不)具有这个特殊性质可能给程序带来的影响。

      2. 如果分析不出来,可以构造(或者拍一个)一个小一点的(不)满足性质的样例。

      没有用?那么执行下面的步骤。

    • 易对拍(已有正确性保证暴力,数据易造):

      1. 拍就完了。转化为规模很小的情况。
    • 难对拍:

      这才是重头戏。我们需要动用一些奇技淫巧。

      1. 将大样例中可能出错的部分单独拎出来,转化为样例较小的情况。

      2. 在不太确定的地方使用 assert 辅助检查。

      。。。。。暂时想不出来别的了。。。

posted @   David_Mercury  阅读(10)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示