考试策略:
开考的时候就看到了 pdf 标题。(然而并没有什么用)
先看了 (T1),感觉不是很可做,所以往下看了其余的题。(T2) 明显的 bfs ,目测代码量可能会很大,自我感觉可能需要的时间比较久,决定留到最后写。瞟了下 (T3) 和 (T4),没啥思路。
然后就开始做题了。
(T1) 上来先码了个 (20pts) 暴力,接着开始想正解。想了很久还是觉得不可做,又怕其他题没时间打,就开了 (T3)。自认为找到了规律,写完手造数据试了一下发现假了。接着去写 (T4),本来想的是暴力枚举第一个人说的话是真是假往下判断,写到 (60) 多行发现又想假了/kk 结果我又去写唯一保证会做的 (T2),可惜没想到 hash 而且时间到了 bug 还没 de 完,成功 MLE+TLE /ll
(T2) 样例只过了一半,就到点了。硬着头皮把 (T3) 写假了的代码交了上去,(T4) 用最后两分钟写了个固输。
期望得分: (20+0+0+0=20pts)
实际得分: (20+0+0+0=20pts)
赛后反思
- 做题心态有问题,模拟赛并不是每道题都写才能拿高分。如果把所有时间都放在一道题上,完全可以想出来。
- 写代码之前一定要仔细考虑好,绝对不能一边想一边写!!!(写一半假了,浪费时间
- 赛后看了题解,发现每道题我思考的方向都没错,而且都很接近正解了,但我没有继续往下想而是认为自己想不出来。这种想法不可取。
- 对于有把握的题就算放到最后写也一定要正确估计所需的时间,没写完等同于没写。
- 发现自己 (T3) 的调试语句没删,删掉的话其实是可以得到 (45pts) 的。属于低级错误。
- 对于 (T2) 这种明显交了也得不了分的代码,不如交一个固输上去,起码还能得 (10) 分。
- 最后要留时间检查文件输入输出、调试语句等问题,以免出现低级错误。
- 如果避免了低级错误,可以拿到 (20+10+45+0=75pts)。
最后祝自己明天模拟赛 (rp++) 啦qwq
Solution:
(T1)
显然,如果 n>=15,那么答案是 hzwer1+若干个 0(可能是 0 个)+数字 k-1的字符串,比如对于 n=16,k=19260817 的情况:hzwer10019260816。
我们接下来做 n<=14 的情况,这只需要找出所有可能的 orz 与 hzwer 字符串
拼成的前缀+数字后缀组合即可——事实上可能的组合的种数并不多,可以手工或写个简单的搜索列举出来,之后我们将这些有限的组合按照价值从小到大排序,查找第 k 小的账号即可。
(T2)
很显然这是道 BFS 的裸题,这题主要的地方在于实现。
一个是枚举滑块占据的范围,一个是移动,一个是状态 hash。
我们将所有棋子分为 1*1,1*2,2*1,2*2 四类,对于每类滑块,我们统一考虑其占据的最左上角的位置,同时用坐标数组记录每类滑块占据的其它位置相对于左上角的坐标,这样我们就可以通过滑块的左上角来处理滑块了。移动的时候,我们先把当前滑块从局面上移走,之后再在相邻的地方放入,这样就能比较好地解决滑块移动之后所占据的位置与移动之前有可能重叠的问题,同时也不用为 1*2 和 2*1 滑块移动方向发愁。
状态 hash 比较简单,局面上每格的状态可以从原来的 8 种压缩为 5 种——空、被 1*1 占据,被 1*2 占据,被 2*1 占据,被 2*2 占据,这样压缩之后本质不同的状态数就大大减少了。
(T3)
如果要求这几个人行走到同一个点且代价最低,那么我们可以分别考虑横纵坐标,最终的聚集点可选取为(横坐标的中位数,纵坐标的中位数)。
而加上题目条件之后,处理也很简单,我们从这一个点开始,强行搜出最后的人员聚集的连通块的形状,再强行枚举每个人最后走到了连通块的哪个位置即可,代价计算也很简单,即为每个人到目标点的曼哈顿距离之和。
(T4)
分两种情况:
一种是没人说了第一种话,这时候直接枚举第一个人说的话是真是假,然后check 就行了。
另一种情况下,我们可以枚举一共有几个人说了真话,那么现在对于所有说了第一种话的人,我们都可以判断真假,反推并 check 即可。
注意到在枚举几个出题人说了真话时,对每个说了第一种话的人,其反推出来的结果只有两种,因此可以对每段预处理一下。