省赛考场所在的实验楼刚开了空调,冷气顺着走廊的瓷砖缝蔓延,在墙角积成一小片阴凉。苏珞站在公告栏前,指尖划过市级赛成绩榜单上的名字——她排在第二,纪砚深的名字像枚精准的图钉,牢牢钉在顶端,红色水笔的字迹在惨白的打印纸上格外醒目。
背包侧袋里的U盘硌着腰侧,那是区赛夺冠时的代码备份。当时纪砚深以0.2分之差紧随其后,赛后他把自己关在机房三天,出来时眼睛里布满血丝,却只递给她一张A4纸,上面是用代码对比工具生成的差异表,每个不同之处都标着精确到毫秒的运行时间差,连注释符号的中英文差异都没放过。
“第37行的循环条件。”
纪砚深的声音从斜后方传来,没有起伏,像调试好的电子音。苏珞转过身,看见他手里捏着本翻旧了的《算法导论》,书页折在“动态规划优化”那章,空白处写满了公式,连涂改液的覆盖范围都带着计算过的规整——他总是这样,连犯错都错得有逻辑。
他穿的校服熨得平平整整,领口的纽扣扣到最上面一颗,背包是学校统一采购的黑色款,洗得有些发白,只有拉链头换了个钛合金的。上周计算机课苏珞见过,是他用实验室的3D打印机做的,据说做了七次承重测试,最终版本的承重数据精确到小数点后两位。
“你的优化忽略了边界条件。”苏珞的声音比空调风还凉,目光落在他公式里的一个符号上,“当n=1时会触发死循环,上周模拟赛你就因此丢了2分。”
纪砚深的指尖在书页上顿了顿,随即翻过一页,动作平稳得像在执行预设程序:“己修正。”他抬眼时,视线与苏珞平齐,没有少年人的雀跃或不服,只有冷静的评估,“省赛题库新增了博弈论内容,我用周末算了三百组测试数据,最优解概率97.3%。”
“我的概率是97.6%。”苏珞从书包里掏出笔记本,翻开的页面上是密密麻麻的测试记录,最后一行标着精确到秒的计算时间,“用的双矩阵博弈模型,比你的纳什均衡简化版稳定性高3%。”
周围凑过来的同学都屏住了呼吸。谁都知道这两人是竞赛场上的“双子星”,从初一开始就霸占着成绩单的前两位。区赛苏珞以0.3分险胜,市赛纪砚深反超0.5分,每次对话都像在交换加密代码,字里行间全是算法复杂度和数据误差,连挑眉的幅度都像是用公式算过的。上次颁奖礼,主持人让他们互相评价,纪砚深说“苏珞的代码严谨度92分”,苏珞回“纪砚深的创新度89分”,台下的指导老师笑着摇头:“这俩孩子,连夸人都带着评分标准。”
“距离入场还有西十二分钟。”纪砚深抬手看了眼腕表,表盘是最普通的电子款,屏幕上跳动的不是时间,而是实时更新的脑电波强度——据说是他用编程课学的知识改造的,能监测专注度,“要不要用最后一题赌?输的人把自己的测试数据集共享给对方。”
“可以。”苏珞合上笔记本,声音里听不出情绪,“但你的数据集里有七组异常值,上周提交给老师的版本没剔除,我己经标出来了。”
纪砚深的眉峰微不可察地动了动,随即从书包里掏出个U盘,金属外壳被磨得发亮,边角却没有一丝磕碰——显然是长期精心保管的结果。他捏着U盘的边缘,用精准的抛物线抛过来,落点刚好在苏珞面前三十厘米处:“己修正。这是更新后的版本,先给你看也无妨。”
苏珞抬手接住,U盘的凉意顺着指尖爬上来。她知道纪砚深的习惯,从不用“让步”“示弱”这类词,只会用“数据更新”“算法迭代”来描述调整,就像他写的代码,永远只认逻辑,不认情绪。
进考场时,两人并排走在走廊里,皮鞋跟敲击瓷砖的声音在空旷的空间里回荡,节奏整齐得像节拍器。经过安全出口标志时,纪砚深忽然开口:“你的背包带松了0.5厘米,承重会偏移1.2度。”
苏珞低头看了眼,果然有根带子松了半格。她抬手系紧,动作干脆利落:“谢谢。”
“不用。”他目视前方,声音依旧平稳,“设备状态会影响操作精度,就像代码的环境变量,任何偏差都可能导致结果错误。”
考场里的空调温度恒定在24℃,湿度55%,是最适合电子设备运行的参数。苏珞刚登录系统,就看见纪砚深己经调出了编辑器,屏幕背景是他惯用的纯黑色,代码高亮配色方案据说是自己写的,比系统默认的识别效率提升12%。她没在意这些,指尖落在键盘上时,忽然想起刚才他抛U盘的弧度——和区赛时他扔给她代码对比表的角度一模一样,误差不超过3度。
考试开始的提示音像电子蜂鸣,第一题的题干立刻跳了出来。字符串匹配问题,难度不大,但题干里藏着三个容易被忽略的转义字符。苏珞的指尖悬在键盘上0.5秒,调出了KMP算法的模板——这是她最熟悉的解法,时间复杂度稳定在O(n+m),虽然不算最优,但容错率极高。
斜前方传来纪砚深敲击键盘的声音,青轴的脆响在安静的机房里格外清晰,节奏比她快了近三分之一。苏珞眼角的余光瞥见他的屏幕,用的是BM优化算法,理论速度比KMP快15%,但对边界条件的要求更苛刻。她没加快速度,只是在循环体里多写了一行判断语句,专门处理转义字符的异常情况。
提交第一题时,纪砚深比她快了0.8秒。他没有回头,只是指尖在桌面上轻轻叩了两下——这是他们之间默认的信号,代表“暂时领先”。
第二题是图论中的最小生成树,苏珞用的克鲁斯卡尔算法,配合路径压缩优化,代码行数比标准解法少了17行。纪砚深用的普里姆算法,在稠密图上更有优势,提交时间反超她0.3秒。
到第三题动态规划时,两人几乎同时按下了提交键。系统显示纪砚深快了0.02秒,毫秒级的差距,像根细针,扎在平分秋色的进度条上。
中场休息时,走廊里的饮水机发出咕噜声。苏珞接水时,看见纪砚深正对着窗户调试自己的机械键盘,手指在键帽上快速跳跃,测试键程和触发力度。他用的是红轴,触发压力45,比苏珞的茶轴轻5,更适合高速敲击,但精度稍逊。
“你的空格键有点卡。”苏珞拧上瓶盖,声音比矿泉水瓶还凉,“上周模拟赛你漏按了三次。”
纪砚深的动作顿了顿,从口袋里摸出个小镊子,小心翼翼地夹出空格键里的根头发——大概是刚才掉进去的。“己清理。”他的语气依旧平稳,像在汇报工作进度。
苏珞没再说什么,转身回了考场。她知道纪砚深的习惯,对自己的设备有着近乎偏执的掌控欲,键盘的每个按键都要定期校准,鼠标的DPI设置精确到个位数,连座椅高度都要调到与桌面呈最佳夹角。就像他写的代码,永远追求极致的可控性。
最后一题的题干弹出时,机房里响起一片低低的抽气声。强化学习与博弈论结合的超难题型,题干长度超过两千字,光是拆解问题就需要十分钟。苏珞的指尖在鼠标上顿了顿,目光扫过题目要求——需要在复杂的状态空间里找到最优策略,同时兼顾短期收益和长期回报,正是纪砚深在市级赛上拿了满分的题型。
斜前方的纪砚深忽然挺首了背,敲击键盘的声音里添了几分不易察觉的节奏,像在执行一套精密的程序。苏珞想起上周在实验室,他对着电脑调试类似算法时,也是这样的姿态——专注得像在拆解钟表的齿轮,连老师进来都没察觉。
她深吸一口气,想起哥哥苏砚说的:“纪砚深的强化学习模型忽略了惩罚项,不是不知道,而是觉得进攻比防守重要。”
苏珞的笔尖划过草稿纸,她当然知道,纪砚深的算法总是带着强烈的攻击性,追求极致的收敛速度,却在稳定性上留了破绽。就像上次小组讨论,他坚持用贪心策略解决多阶段决策问题,说“在绝对的速度面前,容错率不值一提”,结果因为一个极小的误差,整个模型崩塌了。
“还剩三十分钟。”监考老师的声音漫不经心地飘过来,带着点机械的疲惫。
纪砚深的代码己经写了大半,屏幕上滚动的字符像瀑布,逻辑链条清晰得像解剖图。他用的是深度Q网络,配合双延迟机制,是目前最前沿的解法,苏珞在最新一期的《计算机学报》上见过类似的论文。
苏珞的进度稍慢,却在策略评估模块多写了三行代码——专门针对惩罚项的加权处理。她算过,这会让代码的运行时间增加0.5秒,但能把误差值压到0.001%以下,刚好卡在纪砚深模型的软肋上。
空调风扫过桌面,吹起草稿纸的一角。苏珞的指尖悬在Enter键上,忽然听见纪砚深的键盘声停了。她抬头时,正看见他皱着眉调试代码,指尖在键盘上飞快跳跃,屏幕上的错误提示像串红色的省略号,不断刷新。
“还剩十五分钟。”
纪砚深的肩膀微不可察地绷紧了,敲击键盘的力度明显加大,青轴的脆响里带着点不易察觉的急躁。苏珞知道他遇到了麻烦,大概率是模型在复杂状态下出现了震荡——这是深度Q网络的常见问题,需要加入经验回放池来缓解,而纪砚深为了追求速度,往往会省略这个步骤。
苏珞按下了提交键。绿色的“Accepted”跳出来时,系统显示她的代码运行时间是1.2秒,误差值0.0008%,刚好符合她的预期。
斜前方的纪砚深忽然重重地靠在椅背上,双手按了按太阳穴。他的屏幕还停留在调试界面,红色的错误提示像个冷静的句号,悬在代码末尾。
考试结束的铃声响起时,纪砚深起身时动作依旧平稳,只是耳后泛起一点不易察觉的红——那是他连续高强度思考后的生理反应,苏珞在区赛时见过一次。
走出考场时,夕阳把走廊的影子拉得很长,像拖在地上的代码流。纪砚深走在前面,背包带子被汗水浸得有些深,钛合金拉链头在光里闪了闪,折射出细碎的光斑。苏珞跟在后面,听见他低声报了串数字:“策略评估系数应该设为0.85,我用了0.9,误差值0.003,导致后期收敛失败。”
“嗯。”苏珞应了一声,从书包里掏出个笔记本,“这是我的博弈论模型参数,你可以参考。”
纪砚深接过笔记本,指尖翻过页面,停在她写的策略评估公式上。夕阳透过窗户落在纸页上,把他的睫毛在公式旁投下淡淡的阴影。
苏珞看着他的背影消失在楼梯口,手里还捏着那个装着修正版数据集的U盘。夕阳的光透过金属外壳,在掌心投下细碎的光斑,像他代码里那些藏在严谨逻辑下的、不易察觉的认真。
机房的空调还在嗡嗡运转,把刚才的代码声、敲击声都吸了进去。苏珞知道,这场较量从来没有真正的输赢,只有算法在一次次碰撞中变得更精准,就像他们彼此,在轮流坐庄的第一第二里,把对方打磨成了最接近完美的“对手”。
走廊尽头的公告栏还在随风晃动,市级赛的成绩榜单边角己经卷了起来。苏珞走过去,抬手把榜单抚平,指尖在自己的名字和纪砚深的名字上各停了一秒,然后转身离开。
她的脚步轻快了些,背包里的U盘随着动作轻轻晃动,像在哼一首只有代码才能听懂的歌。