首先向牛客同步赛的各位致歉,线下赛的网络环境出的问题导致我校后台人员工作过饱和失能了,一不小心把开始时间设置错了。很抱歉给各位造成了一定的困扰。

本场题解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

能够注意到 的范围非常小,所以可以考虑暴力,但是思考过程还是稍微有点复杂的。

首先要注意到,如果图上无障碍物,那么只需要再放置两个障碍物在 的位置就肯定可以阻止,所以最小值肯定是小于等于

方法一:暴力方法,多重循环判断,把所有可能出现的情况都考虑进去。这种做法会导致代码很长,最后可以实现但是会非常麻烦。

方法二:比 小的数就是 ,判断是否为 的方法就是直接查询能否从起点走到终点,判断 的方法就是遍历所有点(除了起点和终点),在该点上放置障碍物,然后暴力查询能否从起点走到终点。输出其中最小值即可。