如果评分超50,阅读超100,下周将更新我的代码修仙之旅2
我是小学生,第一次发这么长的帖子,可能写得不怎么样,大佬们别骂我,我真的挺认真在写的。
这篇小说是我第一次认真写自己在 编程 路上的经历。不是什么指南,也不是什么教程,就是我自己从零开始学算法的过程,写下来当作记录。里面会有很多我走过的弯路、踩过的坑、以及那些被 WA、TLE、RE、PE、MLE 折磨的日子。可能有些地方看起来会有点啰嗦,但那是真实的我。
写这个之前,我想了很久,到底要怎么开头。
是像别人一样来一句“那年我初入机房,不知代码为何物”,还是更直接一点,就讲我第一次打开那个黑框框编译器时候的样子。
其实说实话,这些事情过去得并不久,但我还是觉得好像已经过去很久了。
我也说不上来到底是从什么时候开始,自己脑子里那些原本乱七八糟的东西,慢慢地被一些像 for、while、if、else、return 0; 这样的词填满了。
有时候坐在电脑前面发呆,脑子里还在想一棵树该怎么遍历,一个区间要怎么合并。
那种感觉很奇特,说不上累,也说不上轻松,就只是……脑子里一直有个程序在跑。
我第一次真正敲代码的时候,其实什么都不会。
我连怎么建个文件都不知道,还问了旁边的人三次,才把那个黑底白字的界面打开。
老师那天讲了 cin 和 cout。
我照着抄,编译,运行,然后屏幕上出现了一行字。
那时候我真的觉得,这跟我小时候第一次拿到新的玩具时很像。
就是那种“这东西好像真的可以玩很久”的感觉。
但很快我就发现,这个“玩具”一点也不友好。
我第一次交题,等了好久,结果出来的是一片红。
我不懂那个 WA 是什么意思,我还以为是网站出问题了。
我试了几次,每一次都是同样的红色。
最后我重新看了一下代码,发现自己少考虑了一种情况。
但那时候我还是很幼稚,改完之后我兴冲冲地再交了一次,结果还是 WA。
后来我才知道,一个程序,不是“改掉一个错误”就等于过了的。
它可能在很多地方都藏着小问题,像一个不说话的陷阱,等你跳进去,然后再慢慢把你的时间吃掉。
WA 是一个很固执的东西。
它不会告诉你哪里错了,不会提示你怎么改,也不会安慰你说下次注意就好。
它就只是简简单单地告诉你:你错啦。
就像一个很严肃、但又不想多说话的老师。
我后来慢慢习惯了 WA,甚至有时候看到 WA 的时候,我会有一种“哦,果然还是 WA”的平静感。
然后我遇到了 PE。
第一次拿到 PE 的时候我愣住了,因为我根本不知道这是什么东西。
以前只知道有 WA,有 AC,有 TLE,从来没见过 PE 这个缩写。
我去查了一下,才发现是 Presentation Error,翻译过来就是“格式错误”。
我当时觉得这比 WA 还要离谱,就因为多了一个空格,它就判你错了。
我不服气,又把代码改了改,结果还是 PE。
后来发现是因为换行符的位置不对。
那时候我就想,如果评测机是一个人的话,那他肯定是个特别在意细节的人。
每一个空格、每一个换行、每一个标点符号,他都会一个一个地对过去。
只要不对,他就不给你过。
那种感觉很无奈,但也是一种磨练。
我在那之后写代码的时候,都会特别留意输出格式,生怕多打一个空格又多一次 PE。
接着是 RE。
RE 是我最害怕的。
WA 起码能告诉你答案错了,TLE 起码能告诉你跑太久了,但 RE 不会。
它只会告诉你程序崩了。
就像一个你本来以为很稳的楼,突然塌了。
你不知道是哪个柱子出了问题,也不知道从哪开始修,就只能一行一行地找。
我第一次遇到 RE,是在一道链表题上。
我当时写了很久,本地试了好多次都是正常的,我就很自信地交了。
结果直接蹦出来三个字母:RE。
我去查报错,又查代码,整整找了一个多小时,才发现自己把一个空指针当成有效节点去访问了。
那一刻我觉得自己特别笨。
就是那种明明知道那里可能会出问题,但自己还是一头撞上去的笨。
从那以后,我写任何和指针、数组下标有关的代码,都会格外谨慎,生怕再踩到同样的雷。
至于 MLE,那是我稍微会写一点代码之后才遇到的。
那时候我学会了开大数组,觉得数组大一点总是好的,万一数据大了呢?
结果我头一次开到了 1000000,提交之后过了一段时间,弹出了 MLE。
我去看题目的内存限制,原来只有 128MB。
那时候我才发现,内存这种东西不是你想开多大就开多大的。
你省着点用,它还能撑一撑。
你要是一直开大数组、开多结构体,它就会像背包被塞满了一样,跑不动,也喘不过气。
这让我学会了在写代码的时候,多想想空间复杂度,想想自己写的程序到底吃不吃内存。
后来我甚至开始觉得,有时候省内存也是一件很有成就感的事情。
最让我难受的还是 TLE。
第一次遇到 TLE,是我自己做一道稍微大一点的题目。
我当时觉得自己写过类似的题,应该不慌,就上了暴力写法。
结果一交,程序跑了好久都没出来,最后告诉我 TLE。
那一刻我的感觉,就像是自己在一条很长很长的路上跑,跑了很久很久,结果前面有个牌子写着“此路不通”。
你明知道这条路是对的,但你跑得太慢了,永远到不了终点。
后来我开始学优化,学二分,学前缀和,学那些能让程序跑得更快的方法。
我一开始觉得这些东西很绕脑子,有时候看着别人的代码,觉得他们写得真的好简洁,好明白。
但自己写的时候,总是会慢半拍,会多想,会绕远路。
不过慢慢也就习惯了,也慢慢地开始觉得,优化其实也是一种很有趣的挑战。
在这些错误里摸爬滚打了一段时间之后,我突然有一天 AC 了一道稍微有点难的题目。
其实它算不上很难,在我的水平里,算是中等偏上一点点的那种。
但那次我提交之后,看着那个绿色的 AC 标志出现在屏幕上,我愣了很久。
也没有特别激动,就是觉得,好像之前那堆 WA、RE、PE、MLE、TLE,都是为了这一刻在铺垫。
它们像是在告诉我,别急,慢慢走,总会走到对的路上。
写这篇的时候,我其实已经走过了很多弯路。
我也知道以后肯定还会遇到新的问题。
但我觉得这一路走来,还是值得的。
也许十年之后的自己,回头看这个帖子,会觉得当时的自己真的很菜,很幼稚。
但那时候的我,肯定也会感谢那个笨笨的、连 PE 都要百度一下才知道是什么意思的我。
因为他没有放弃,他一直在写代码,一直在调样例,一直坐在那个风扇嗡嗡响的机房里。
—— 我的代码修仙之旅1,完。
我的代码修仙之旅2,敬请期待
(我是小学生,很多地方写得不好,也没写出大佬那种感觉,但我写的时候挺认真的。希望能有人看到,也希望能有人告诉我哪里写得不好,我会慢慢改的。)



