6.11 中考前一天打的比赛

发布时间 2023-06-12 15:20:11作者: zhuzc_114514

http://oi.nks.edu.cn/zh/Contest/RankListOI/2364

当时在坐校车,所以这场晚做了半个小时,但考的也看得过去

T1:签到题

http://oi.nks.edu.cn/zh/Problem/Details?cid=2364&tid=A

一道构造题,比较简单,但我不太擅长构造,所以这道写了大概一个小时。思路也比较清楚,就先放限制了的数字,不能放当前数字的话,要么放后面的,要么和前面换。最后再把没限制的全部随便放进去。

后面听了一下他们的思路,可以开两个指针,一个front=1,一个back=n。从1开始放,如果放不了其中一个,那就肯定能放另一个,放了后front++或back--;到最后只剩一个数时,也是和前面的交换;

T2:翻转

http://oi.nks.edu.cn/zh/Problem/Details?cid=2364&tid=B

看着就像得先贪一波。

已经翻转好的不用再翻了,开一个end数组,表示我现在还要翻1~end[i],从每一排最end[i]往前找j,(j和end[i]在同一段),为了方便,我们开一个to[i],指i连续的一段的末尾为to[i];翻转后,j~end[i]一段连续的值就被我翻好,end[i]=j-1。但由于我i+1行的j必须比i行的j大,所以就把j开在i循环外面,类似一个指针,只能增不能减。这也许会导致我无法一次把end[i]的一段翻完,所以还要有一些特殊的小判断(to[i]>=end[i]而不一定是==)

这题花了我一个多小时,A了,还不错;

T3:弹弹床

http://oi.nks.edu.cn/zh/Problem/Details?cid=2364&tid=C

一眼DP,部分分是状压的,当时没时间写了,很可惜。

这道题我觉得很不错,平时也见过这种题,但没做出来。现在A了,也了解了一些方法。

首先先应该缩小 设的状态,原本是2^n,先尝试缩成n*n,即f[i][j]。第一维肯定是前i个,第二维不确定,存总方案数。经过一波规律探究,可以发现状态是如果前i个全部跳完,并不好转移状态,所以j设为前i个分成j段,其中每一段的最后都往右(每一段都假设独立,不存在跳到另一段)(如果最后往左,那直接跳出去了,无解,所以只看往右)。如果i位为R,那要么跟在前面段的后面,要么自成一段;如果是L,那要么跟在别人前面,要么合并两段

最后统计答案,对于第i位,要么是左边跳j+1段,右边跳j段,要么是左边跳j段,右边跳j+1段,也有可能两边都跳j段; 每一段又有区别,所以还要乘上j或j+1的排列

具体实现看代码