2020年8月10日深夜,我在 PTA 上开始做 1005 这道题。这道题不算困难,我在 1h 之内就实现出了一种解法,但我的问题不是这道题本身,而是我难熬的解题过程。
实现并提交之后,我第一个解法的实现只通过了 5 个测试点中的 3 个,错误不是因为输出格式错误。有经验的人可能会立刻想到以下两种可能性(可能性由大到小排序):
- 边界条件导致算法失效。
- 算法(以及实现)的问题。
首先是边界条件导致算法失效,我处理了数组越界(见 make_bitset 函数),而且我的算法没有边界条件,也没有出现计算误差,所以这一点不成立。
那么是算法及其实现的问题?我心中只有两个问题:
为什么还能有三个点对呢?
为什么我使用题目下面的输入样例没有问题,随便试了几个数据也没问题,最后却会出错呢?
这两个问题让我熬了2天夜,日思夜想,反复推演。最终我确信我的算法不仅没有错,而且还过度保险了,那么实现的哪个部分有问题呢?最后的最后,8月12日凌晨5点,我放弃了,并去找了这道题的题解。我看到题解中的实现和我的算法实现几乎一模一样,除了一句话std::sort(...);
输入数据居然不是增序且不相同的?!我吓了一跳,看了一眼题目的输入格式:
每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1<n≤100)的值,数字间用空格隔开。
啊,我好菜啊。
等等,我才看过《 Joel 谈软件》,里面有文章提到日本人发明的“五个为什么方法”来寻找根本原因。“我好菜啊”是表面原因,打个哈哈掩盖了根本原因。为了找到根本原因,我决定试用这个方法。那么,下面是我问自己的五个为什么:
为什么我整整花了两个凌晨来排查两个错误的数据点?
因为我以为输入数据是有序的,而且我并不知道怎么排错。
为什么?
因为我看到了有序的输入样例。我看题面时又看到“互不相同”,所以产生了输入数据“有序且互不相同的印象”。同时,我并不知道自己是犯了什么样的错误,只能一遍遍的重复查看代码和 OJ 的结果。
为什么?
因为我认为这种题目可能刁难人的重心是放在算法代码实现上而不是在输入数据上,所以我预设了“输入数据的处理很简单”这件事,只草草看了看输入样例,而没有认真的看文字描述。同时,我太久没有做 OJ 题目了,已经忘记了我在 OJ 题目常犯什么样的错误。这种错误我之前肯定也犯过。
为什么?
深夜做题可能会让我的理解力,记忆力下降吧,所以我才没那么仔细的读题。而且我早就应该把自己在 OJ 犯过的错误记录下来了,但之前没有记录。
为什么?
我作息十分的不健康,而且深夜我才能静下心,所以才会深夜开始做 OJ 题。而且我之前懒得记录 OJ 常犯的错误。
为什么?
可能是拖延症导致自己拖延自己的改变吧,而且太久没运动了意志力又消退了,事实上应该找一天好好的把作息调整过来。之前懒得记录是因为常做题有手感。所以,我应该要记录下来不常用的知识。
问完这五个问题,我知道了我以后要解决的根本问题:多运动增强意志力,把作息调整过来来增强自己的理解力和记忆力,以及要把不常用的东西记录下来以免忘记。
这种对自身根本上的自省是一项很重要的能力,但是这个世界往往让人浮躁的难以自省,所以我要应该要重新做到“慎独”。在这个互相捧杀的世界里,大家已经习惯了用“大佬大佬”和“我真菜啊”来给各式各样问题打哈哈,但是我不应该限于打哈哈而是应该试着用“五个为什么”这样的方法来自省,这样获得的进步才是真实可持续的。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 [email protected]