首先向牛客同步赛的各位致歉,线下赛的网络环境出的问题导致我校后台人员工作过饱和失能了,一不小心把开始时间设置错了。很抱歉给各位造成了一定的困扰。
本场题解PDF版点击这里获取。
A
题目要求找到最小时间 ,考虑二分。
对于二分出的时间 ,对于所有准备好的调料,可以预处理出后缀和
。从前往后遍历所有披萨,当前披萨
的灵力值可以
计算为
。如果存在一个披萨灵力值
,那么返回
;反之返回
。
B
本题是用于防 AK 的大模拟。题目背景取自三国杀。其中的题目数据也有改自游戏某关(BV1uN411g7RT P143)。
标准程序使用了 BFS 对每一步可能到达的移动结果进行广搜并记录状态,但由于限制了步数,也可以采用 DFS 剪枝的方式进行深搜。
标准程序所计算出来的最短解法如下(不包含样例,按 case 顺序输出)。
9
dwwadsdwa
20
aawdsdsdsaasawaawdds
25
wadsdwwasadwawssdswdwdssa
30
sawawawsdwasdasawdwawdsdwdsasd
C
对于本题,可行的解法是线性时间复杂度的动态规划。
设 表示第
个单元格涂上红色/蓝色能获得的最大分数,我们可以得到以下方程:
最终的答案为 。
D
暴力枚举给定排列,使用一个数组记录当前数字的使用情况。从头开始执行遍历流程,如果当前数字没有被使用,则它在遍历过程中第一次出现并且属于当前的循环节,将其标记后记录当前循环节的长度增加。当遍历到被使用的数字时,证明该环已经全部遍历完成,计算总长度以后与最大值和最小值分别比较。再寻找下一个没有被使用的数字开始新的枚举流程,以此类推。
E
这是一个经典的数学题,现在我们拿 个囚徒
个盒子来举例,随机排列的
个盒子,包含长度为
的循环概率是多少?显然,答案是
。
这是一个普遍的结果,长度为 的概率是
,长度为
的概率是
,因此推广到长度超过
循环的概率就是
,这个数字大概是
,即囚徒们失败的概率,再拿
减去这个数即囚徒们成功的概率。以此说明推广到
个囚徒和
个盒子,发现这就是一个简单的数学公式,答案为
,复杂度为
。
下面是对于包含长度为 的循环出现概率为
的补充证明:
先举个简单的例子: 个囚徒
个盒子,所有组合是:
:
个
阶循环。
:
个
阶循环,
个
阶循环。
:
个
阶循环,
个
阶循环。
:
个
阶循环。
:
个
阶循环。
:
个
阶循环,
个
阶循环。
设 ,有
那么 个囚徒
个盒子呢?
对于 来说,出现一个循环后,剩余循环组合里必然不会出现其它
的循环了,所以这些循环是互斥的。所以,我们先从100个选
个进行排列组合,然后剩余的
个组成循环。得到计算公式
。
以上结论经过推广,到 个盒子就有
。
F
字符串长度并不长,唯一的坑点是因为存在空格,所以需要使用 getline 读入。查询的方式就比较多样,不再赘述。
G
首先对原点集求凸包,将该凸包顶点与其边上的点从原点集中剔除,再进行一次求凸包。将两次求得凸包的面积相减即可得到魔戒的面积。
因为数据保证所有点不会均在同一条直线上,第一次切割必然能够得到一个合法的多边形,但第二次切割时就可能出现没有点或点均在一条直线上的情况,注意对于这些情况的判断。
依据Pick定理,我们可以得知最终求得面积的二倍一定是一个正整数,加之本题的数据范围较大,运算应在整数域中进行,以保证不会出现精度问题。
H
本题数据范围较小,做法较多。其中一种做法是枚举所有选取节点的方案,判断是否联通和连接未选取的节点,记录花费最小的方案。判断联通可以用并查集,判断连接节点可以用 BFS 。
I
根据题意可知,在任意两位大学生 之间,其中位置相对靠后的大学生必然因靠前的学生产生
的不满度,而靠前的大学生不会对靠后的学生产生不满度。也就是说,任意两位大学生之间必然有一次不满度产出,且不满度产出只和二人之间的顺序有关。因此,我们只要贪心的保证每两个人之间的不满度产出均最小,即可保证总不满度最小。
同时,可证明上述排序一定能够实现,流程如下:
我们假设使得相互之间不满度均最小的排列方式不存在,那么必然存在 使得以下不等式同时成立:
根据题意可知,在任意两位大学生 之间,其中位置相对靠后的大学生必然因靠前的学生产生
的不满度,而靠前的大学生不会对靠后的学生产生不满度。也就是说,任意两位大学生之间必然有一次不满度产出,且不满度产出只和二人之间的顺序有关。因此,我们只要贪心的保证每两个人之间的不满度产出均最小,即可保证总不满度最小。
同时,可证明上述排序一定能够实现,流程如下:
我们假设使得相互之间不满度均最小的排列方式不存在,那么必然存在 使得以下不等式同时成立:
计算可得,以上不等式无法同时成立,即证明一定存在一种排列方式使得任意两人之间的不满度均最小。
所以,我们只需要按照 的规则进行排序即可保证不满度最小,同时注意最终要求
,编写排序规则时应包含这一点。
计算可得,以上不等式无法同时成立,即证明一定存在一种排列方式使得任意两人之间的不满度均最小。
所以,我们只需要按照 的规则进行排序即可保证不满度最小,同时注意最终要求
,编写排序规则时应包含这一点。
J
本题有BFS与最短路两种解法。
因为本题并没有特别大的数据范围,所以常见单源最短路算法均能正常通过,只要注意添加对于已坍塌的点的判断就可以当成板子题看待,该做法不做展开细讲。
对于BFS做法,关键在于如何处理零号路径,我们考虑在原BFS队列的基础上额外建立一个队列。我们在BFS的过程中,将经过一号路径搜索得到的点打入原队里,零号路径则打入额外队列。当额外队列不为空时,优先从额外队列取出点进行BFS直至额外队列为空,再处理原队列。注意不要忘记对点是否崩塌进行判断。
K
首先考虑一种简单情况:从左到右只增不减最少要用多少个木板?
我们遍历每一个元素 ,若
,说明出现了递减区间,必须要对
进行增高处理。
但是如果只增加 的值,就可能导致原本不用增高的
也要使用木板增高。
因为最终结果与木板的长度无关,所以为了不影响后面的元素,我们可以直接用长度为无限长的木板把从第 个位置到最后一个位置的元素垫起来。
再考虑题目的这种情况,可以用类似方法求使右区间递减的最小代价。
枚举左右区间的分界点 和
,将左区间所有用到的木板从延伸到无限远改为延伸到位置
,同理右区间的木板向左延伸到位置
。
观察到左右两边的部分木板会挨在一起,那么就可以将两个木板拼为一个,在此分界点的最小代价就是左右区间代价的最大值。
代价最小的分界点就是题目的答案。
L
个人
天
桶水,根据已知条件可以判断出来,
个人一天喝
桶水。
至于判断小数,我们可以将人数与天数相乘,再对 取模,这样就能判断是否是小数了。如果取模结果为
,则证明可以购买整数桶水正好喝完。
M
能够注意到 的范围非常小,所以可以考虑暴力,但是思考过程还是稍微有点复杂的。
首先要注意到,如果图上无障碍物,那么只需要再放置两个障碍物在 的位置就肯定可以阻止,所以最小值肯定是小于等于
。
方法一:暴力方法,多重循环判断,把所有可能出现的情况都考虑进去。这种做法会导致代码很长,最后可以实现但是会非常麻烦。
方法二:比 小的数就是
和
,判断是否为
的方法就是直接查询能否从起点走到终点,判断
的方法就是遍历所有点(除了起点和终点),在该点上放置障碍物,然后暴力查询能否从起点走到终点。输出其中最小值即可。