2019牛客暑期多校训练营(第十场)
Contest Info
[Practice Link](https://ac.nowcoder.com/acm/contest/890#question)
Solved | A | B | C | D | E | F | G | H | I | J |
---|---|---|---|---|---|---|---|---|---|---|
9/10 | Ø | O | Ø | O | O | O | Ø | O | - | Ø |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
A. Blackjack
题意:
咖啡鸡在玩游戏,有\(n\)张卡片,每张卡片的点数为\(x_i\),现在将他们随机打乱,每次咖啡鸡可以抽一张卡,如果它抽出的卡的点数之和\(>b\)那么它就输了。
否则, 如果点数之和\(> a\)并且\(\leq b\),那么它就胜利了,问它获胜的概率。
思路:
- 咖啡鸡显然要一直抽卡,知道胜利或者失败
- 那么我们考虑枚举最后一张卡\(x_i\),那么前面抽的卡的点数之和的范围为\((a - x_i, b - x_i)\)。
- 假设前面抽的卡的点数之和为\(y\),抽了\(k\)张卡,那么总的方案数为\(dp[y][k] \cdot fac[k] \cdot fac[n - k - 1]\)
- 其中\(dp[y][k]\)表示抽了\(k\)张卡,点数之和为\(y\)的方案数,但是其中不包含当前这张卡.
- 那么最后算出的总方案数除以\(fac[n]\)即可
B. Coffee Chicken
题意:
给出一个字符串的递推式,问\(S(n)\)的某一段长度为\(10\)的子串是多少
思路:
先预处理出长度,再根据长度决定递归左边或者右边即可。
C. Gifted Composer
题意:
刚开始有一个空字符串,现在每次从头部加入一个字符或者从尾部加入一个字符,每加入一个字符后,询问当前字符串的循环节数量。
思路:
考虑一个循环节\(x\),它出现的时间为加入\(x\)个字符之后,并且它存在的时间是一段连续的时间,那么直接二分它消失的时间即可。
为什么是连续的?
因为考虑某一时刻这个字符串已经不是\(k\)循环的了,那么之后往它后面加入字符,那么它也不可能是\(k\)循环的,因为它前面那部分已经不是\(k\)循环了,加在前面同理,因为后面已经不是\(k\)循环的了。
怎么判断一个字符串是不是\(k\)循环的?
判断\(s[1, n - x]\)和\(s[x, n]\)是否相同即可。
D. Han Xin and His Troops
题意:
给出\(n\)个同余方程,求解。
思路:
\(CRT\)非互质版模板题。
E. Hilbert Sort
F. Popping Balloons
题意:
在\(10^5 \cdot 10^5\)的矩阵中,可以横着射三箭,竖着射三箭,但是要保证横着射相邻两支箭之间的差值为\(r\),竖着射相邻两支箭之间的差值也为\(r\)。
但是可以不射满三箭
思路:
枚举行或者列,然后维护列的起点的贡献。
直接枚举每个气球去修改,因为每个气球只会跟三个列起点有关。
G. Road Construction
题意:
在二维平面上有若干点,要求画一条直线,使得直线两边的点的数量相同,并且满足距离直线最近的点的距离最大。
思路:
- 一个性质,直线的斜率肯定是某两个点的连线或者与之垂直
- 那么直接枚举斜率,然后将所有点按该直线排序,取中间两个点的距离之差除\(2\)即可
如果按直线排序?
考虑直线方程:\(kx - y + C = 0\)
那么点到直线的距离为\(\frac{kx - y}{\sqrt{k^2 + 1}}\)
那么就知道点到直线的相对距离,可以通过改变\(C\)来移动直线。
H. Stammering Chemists
J. Wood Processing
题意:
有\(n\)个矩形,高度相同的矩形可以拼起来。
现在需要拼出\(k\)块矩形,可以切掉一些矩形的一部分,使得它可以和别的矩形拼起来。
问拼出\(k\)块矩形需要切掉的最小面积。
思路:
- 将问题转化成保留最多的面积。
- 然后将矩形按高度从大到小排序
- 令\(f[i][k]\)表示前\(i\)个矩形分成了\(k\)个保留的最大面积
- 那么转移就是:
注意式子的前面部分:\(f[j][k - 1] - sumw[j] \cdot h[i]\)是一个\(b - kx\)的直线形式。
直接维护一个上凸壳进行转移即可