CSP-S 赛场,小 C 的算法思路完全正确:他写了一个三重循环的解法,样例全过。可他心里有点不安——因为最大数据是 n = 2000。
他试着估算:n³ = 8×10⁹。他听说"1 秒能跑 10⁸ 次运算",心里算了一下:那要 80 秒。但小 C 想:"我本地跑样例时,程序几乎是瞬间输出结果的呀!"于是他按下了提交。
结果:TLE,0 分。因为样例的 n = 10,10³ = 1000 次运算当然"瞬间完成"——他用最小的数据验证了最大的风险。
同一场的另一道题,小 D 的程序"跑着跑着就崩了",屏幕上只有一个冰冷的 Segmentation fault (core dumped)。很多人对这种错误的反应是"随便改改试试看",改了两小时也没找到。小 D 的做法完全不同:
g++ a.cpp -g -O0 -Wall -o a
gdb ./a
(gdb) run
(gdb) bt
#0 main () at a.cpp:14
三条命令,问题定位到第 14 行:a[i + 1] 在 i 取到最大值时越界。
"猜"和"看"之间,差的不是天赋,而是一套方法与两个工具。
💡 本讲要解决的两个核心痛点
痛点一 · 不知道程序能不能在时限内跑完。解法是"先估算、再实测":用复杂度与 108 这把尺子做纸上估算,再用 time 命令做真实验证。两者对不上时,说明你的复杂度分析错了。
痛点二 · 程序出错但不知道错在哪。解法是 GDB:让程序在指定位置停下,把每个变量的值"看"出来。GDB 的价值不是"更高级的 printf",而是随时暂停、随时查看。
两者共同的思维方式:把模糊感觉变成可测量的事实。这也是信息学竞赛考察的核心素养之一。