本题为CCF CSP2017年9月题目的第二题。我第一次做这道题的时候,使用了结构体,以及许多vector,以至于逻辑分析的时候因为名字太多,自己都感觉很累。虽然最后成功做出,提交满分,但一直不是很满意。于是过了一阵子(也就是最近)又做了一遍,理顺了思路,终于把冗长的代码简化(80~90行→40行),所以现在想要来分享一下我做这题的思路,并给出提交得到满分的C++代码。题目不贴,我认为看到本文的应该已经提交过至少一次该题的程序了,所以我会直接分享我的思路,也因此不建议没做过本题的童鞋看本篇文章。
碰到这样的模拟题,一般都要把题目读完,并且从中理顺逻辑,具体的流程应该是怎么样的。题目中使用&归还钥匙的要点如下:
(1)取钥匙的时候,老师们都会找到自己所需要的钥匙将其取走,不会移动其他钥匙。这个非常好理解,keys[pos] = -1即可。
(2)还钥匙的时候,还钥匙的老师会找到最左边的空的挂钩,将钥匙挂在这个挂钩上。这个也没问题,关键是找到位置。
(3)如果有多位老师还钥匙,则他们按钥匙编号从小到大的顺序还。这意思就是,同一时刻可能有多个老师还钥匙,因此要维护一个表,存储当前时刻所归还的钥匙的编号,并且还要从小到大排序。因为钥匙肯定不会重复,所以使用C++标准库的set可以非常方便地实现这个需求。另外,这也提醒了我们,还钥匙可能多人同时还,