NOIP2016提高组初赛(C++语言)试题 个人的胡乱分析 Part 3.

时间:2021-04-01 19:08:03

胡乱分析的第三部分,程序填空(所谓的完善程序)

说到初赛,好像本周六就是了。哇好激动。。

填空题都是玄学。也许get到点了就会好做一些。。

(标的是填在空里的答案)

T1.交朋友

(小矮个没*系列,最后才让找)

(快排判定条件展览大会)

(让你成天用STL sort,傻逼了吧)
“我们用排序+链表的方式帮助每一个人找到在他之前进入教室的并且和他身高最相近的人,由于我们直到所有人的身高和走进教室的次序,所以可以采用离线的做法来解决这样的问题。”

给定的程序大体思路是排序后从后往前算与每个同学身高最相近的人,然后把这个同学从链表中踹出去删掉。

想必看这篇随笔的各位手头都有题面吧,具体题面我就不说了。

第一空,快排交换元素的判定条件。

各位 是 i <= j 不是 i < j 不是 j <= i 不是 j < i 更不是其他奇怪的东西,本来还想说点啥,但是。。这个的确没啥好说的。。。

第二空,数组模拟链表指针。

看到循环里有previous数组,下文中也提到了next数组,自然能想到这俩数组有啥特殊含义。

上一句是previous[rank[i]] = rank[i-1],指向上一个节点;这句照葫芦画瓢地写就是next[rank[i]] = rank[i+1],指向下一个节点。

第三空,更新变量的值

出题人您挺喜欢镜像写法啊,您之前那个更新shorter的操作已经把答案全暴露了。。

嗯,higher = height[next[i]] - height[i]

第四空,维护answer数组。

题意说了要找一个身高差小的做朋友,因为之前已经排了序,所以只需要计算身高差即可,取身高差小的那个做朋友。看到if判定成功的执行语句是answer[i] = previous[i],那看来是上一个节点身高差比下一个节点身高差小了,自然想到shorter要比higher小才会这么干。

所以啊,shorter < higher

第五空,听说你已经找到朋友了?把他踹出去  更新链表

出题人您能不能别在上边写一个相似的语句提示我答案了。。。。。镜像写法不好玩啊。。。

此乃链表删点的基本操作,被删去的这个节点的上一个节点把后继接在这个节点的下一个节点上,然后,被删去的这个节点的下一个节点把前驱接在这个节点的上一个节点上,就能完成删除操作,因为这个节点已经被孤立了,它不再属于链表。

出题人已经非常好心的把绿色的操作写在上头了,你只需要把蓝色的那个 previous[i] = previous[next[i]] 操作写在空里就行,对对,就是那个previous[next[i]] = previous[i]

 

我想睡觉了,第二题明天更新。