此时,考场中其他的同学,大都陷入了焦头烂额的状态之中。题目本身的难度、心态不稳、对环境的不适应等种种因素,让他们答得都十分的挣扎。特别是那种每一道题都没有明确思路的考生,此时心里真的是有些绝望了。
陈季常深吸一口气,一道题一道题地琢磨。很快,第一道题他就有了思路,开始双手如风,啪嗒啪嗒地飞快敲击键盘。
这种快速的键盘敲击声对于那些还没有任何思路的考生来说,就是一柄直刺心窝的利剑,让他们的心态更加慌乱起来。
竞赛就是这样,既分高下也决生死,没有那么多温情脉脉,刀光剑影都隐藏在安静舒适的考场环境之中!
第一题终于完成了,陈季常并没有立即提交,编译完成后就把它放在一边,准备最后有时间检查一遍再交!
他现在开始攻打第二道题。这道题要更难一些!
给定N个带权节点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为哈夫曼树(Huffman Tree),而第二题的关键就是如何正确恰当地构建哈夫曼树!
陈季常反复思索,在脑海里模拟构建流程,大约花了二十分钟时间,他终于有了完整的思路。于是,快速的键盘敲击声又再次响起,给了那些现在一道题都没有思路的考生致命一击,让他们甚至有了生无可恋的感觉!
花了半个小时完成程序编写,终于编译通过了,陈季常依旧没有立即提交,放到一边等待有时间再检查检查。
现在要面对的就是最后一道题了,这道题果然是难度最大的,陈季常看了十分钟,居然一点儿思路都没有!
陈季常有些心慌了,心怦怦地跳个没完!他知道自己必须立即调整心态,否则就真完了!
陈季常闭上眼睛,口中默念《太上老君常说清静经》,竭力使自己平静下来!不知过了多久,突然一道闪光划破漆黑的夜空。带来一瞬间的光明。然而就是这一瞬即逝的闪光,却让陈季常看清了前方崎岖的小路!
他终于有了思路!
对于第三题,需要计算所有子序列的谷物棒数量总和为K的不同选择方式的数量。由于直接枚举所有子序列并计算其和是不现实的(因为子序列的数量是2n,其中n是位置的数量),这就需要采用一种更高效的算法。
这个问题可以通过动态规划(Dynamic Programming, DP)来解决。可以定义一个DP数组dp[i][j],其中dp[i][j]表示考虑到前i个位置时,谷物棒数量总和为j的不同子序列选择方式的数量。
接下来,就要考虑如何更新这个DP数组。对于每个位置i,有两种选择:选择该位置的谷物棒,或者不选择。
如果选择位置i的谷物棒,那么就需要从之前的状态dp[i-1][j-p[i]]转移过来。此时,dp[i][j]应该加上dp[i-1][j-p[i]]。
如果不选择位置i的谷物棒,那么可以直接从之前的状态dp[i-1][j]转移过来。此时,dp[i][j]应该加上dp[i-1][j]。
因此,状态转移方程为:
-1][j] (if j >= p[i] then dp[i-1][j-p[i]] else 0)
0]= 1(即没有选择任何谷物棒时,和为0的方式只有一种),其他dp[0][j]`(j>0)均为0。
最后,需要的答案就是dp[n][K],即考虑到所有n个位置时,谷物棒数量总和为K的不同子序列选择方式的数量。
陈季常盯着题目,再次思索半个小时,终于有了完整的解题思路,他迫不及待地飞速敲击键盘,一时间快速的键盘敲击声又再次响起。
几个已经准备躺平的考生已经不再会受到任何打击了,他们饶有兴趣地数了一下,立马就推断出陈季常已经开始总攻最后一道大题,而且即将拿下了!
他们心里不免叹口气:“唉,人与人的差距真的有时候比人与狗都大!”
陈季常飞快敲击着,屏幕上显现出一行行代码。
“
……
n, K = map(int, input().split())
p = list(map(int, input().split()))
dp =[[0]*(K 1) for _ in range(n 1)]
dp[0][0]= 1
for i in range(1, n 1):
for j in range(K 1):
dp[i][j]= dp[i-1][j]#不选择当前位置的谷物棒
if j >= p[i-1]:
dp[i][j]=(dp[i][j] dp[i-1][j-p[i-1]])% MOD #选择当前位置的谷物棒
print(dp[n][K])
……
”
程序终于编写完毕了,陈季常急速检查一遍,发现没有什么错误,立即点击编译按钮!
然而,让他惊慌失措的事情发生了,编译提示出错,报整数溢出错误!根本就进行不下去!
陈季常眼前一黑,脑袋一晕,差点儿倒过去!
他用力掐了自己一把,强行让自己清醒过来。深呼吸几次,让自己恢复平静,这才开始一行一行检查自己的程序代码!
一行又一行,陈季常检查了三四遍,依旧找不出错误原因。
他有些绝望地靠在椅子上,两眼无神地望着屏幕。时间只剩下十分钟了!看来自己无法完整拿下最后一道大题了!
“整数溢出错误?为什么会这样?自己赋值错误还是参数定义错误?可是全都检查了,没错误呀!”陈季常的脑子飞速运转,突然,他想到一种可能!
“会不会是中间计算结果本身就会造成溢出?对呀,这个题的中间数值好像非常大,会带来极多的小数位,造成中间结果变量整数溢出!”陈季常顿时来了精神,双手再次放在键盘上,敲击起来。
为了验证自己的猜想,陈季常在每一次计算的后面加了一条变量输出显示的语句,这样调试运行时,自己就能看见变量的每一次计算结果,确定是不是因为数值过大造成的溢出!
调试结果完全和陈季常想的一样,仅仅三次计算后,数值就达到了整数定义的上限,直接溢出了!
陈季常心里狂喜,叫了一声好。
找到原因困难,解决方法却很简单,只需要每一步计算时都对答案取模,控制中间变量的大小,以避免整数溢出就行了!
就这样,陈季常飞速完成程序修改,再次点击编译运行按钮,十几秒后,编译通过,可执行文件生出出来!
陈季常长舒了一口气,终于搞定了!
然而就在这时,监考老师高声提醒:“各位考生,考试结束时间只剩下一分钟,还没有提交结果的同学请立刻提交,否则视为无结果答卷!”
陈季常吓了一大跳,原本为了最后再对代码检查完善,所以三道题结果文件全部没有提交。现在只能立即提交,检查完善就放弃了!
他眼疾手快,迅速把每道题的源程序文件和编译执行文件上传到自己的服务器目录空间里,对比了每个文件的大小,确保没有文件上传损坏,这才安下心来!
就在这时,秒针指到了最上方,考试结束铃声响起!
“全体考生起立,双手离开键盘,不得再次敲击,否则视为违纪!”监考老师大声命令道,目光扫视全场,看看是否有不听话的考生。
显然,有不少考生程序只敲了一半,心中极度不甘,但也只能长叹一口气,站起来,双手离开键盘。
监考老师登录服务器,开始逐个检查考生上传的文件是否损坏,确定全部正常后,直接断开服务器与无盘终端的链接。这么一来,就算是哪个考生想做题,都打不开虚拟磁盘目录了!
“考生可以全部离场了,注意带好自己的个人物品,不要有遗漏!”
随着监考老师的宣布,大家拿好东西,有序离开教室。出了教室,顿时就喧嚣起来了,一个个叫着嚷着,蜂拥着往外面跑去!
陈季常出了教学楼,见到了带队老师以及几个队友,连忙小跑了过去。
“陈季常,考得怎么样?都做出来吗?”带队老师一见面,就急切地问。
陈季常有些郁闷地摇摇头,而后又点点头,直接把老师弄懵了!
“什么情况?是做出来了还是没做出来?”老师追问道。
“做是全做出来了,只不过最后没有时间了。原本打算最后对代码调整优化,添加注释什么的,最后只能匆忙传上去,这些都没做。肯定要被扣不少分!”陈季常有些沮丧!
“哎呀,你这大喘气的!吓了我一跳!”老师长舒一口气,笑着安抚道:“那些都是细枝末节,全都做出来就应该能拿金奖,你就别叹气了。”
“金奖?”陈季常一听,眼睛顿时亮了,一股巨大的喜悦将他包裹,有点儿难以置信地问道:“这样也能拿金奖吗?”
“你就别凡尔赛了!”一旁的小胖子赖家宝看不过眼了,叫道:“这次题这么难,问了一圈,能三道都做出来也就两三个!金奖你是拿定了!我就惨了,第三道只是胡乱写了一半,估计能给个三五分都是老师心情好!”
“呵呵!”陈季常尽管知道不合适,依旧忍不住露出一个大大的笑容。
带队老师心里也高兴起来,刚才问了一圈,除了梁学波都没完成第三道,现在又多了一个陈季常,两个金奖在手,也算有个交代了!