文章目录
2019牛客暑期多校训练营(第十场)
A Blackjack
题意:给定n个物品,每个物品有一个
v
a
l
u
e
value
value,每次不放回抽取一个物品,如果抽取的value总和小于
a
a
a,继续游戏,如果
a
<
s
u
m
≤
b
a < sum \leq b
a<sum≤b,则Calabash 赢,如果
s
u
m
>
b
sum > b
sum>b,则Calabash 输,求Calabash 赢的概率
分析:这是背包问题的一个变型,如果使用
i
n
t
128
int128
int128计算所有的方案数,大概能过
80
80%
80的样例,所以需要边计算方案数边计算概率, 先进行所有物品的
d
p
dp
dp,
d
p
[
i
]
[
j
]
[
k
]
dp[i][j][k]
dp[i][j][k]表示如果从前i个物品中选取j个物品,价值为
k
k
k的概率是多少
d
p
[
i
]
[
j
]
[
k
]
=
d
p
[
i
−
1
]
[
j
]
[
k
]
+
d
p
[
i
−
1
]
[
j
−
1
]
[
k
−
x
[
i
]
]
∗
j
/
(
n
−
j
+
1
)
dp[i][j][k] = dp[i-1][j][k]+dp[i-1][j-1][k-x[i]]*j/(n-j+1)
dp[i][j][k]=dp[i−1][j][k]+dp[i−1][j−1][k−x[i]]∗j/(n−j+1)
代表第i个物品,可以选,也可以不选,如果选了,可能再
1..
j
1..j
1..j次取的过程中被取,总的概率需要除以
n
−
j
+
1
n-j+1
n−j+1,可以采用滚动数组
最后需要做一次背包回退,求出不选第
i
i
i个物品,选取
j
j
j个物品,价值为
k
k
k的概率是多少,然后计算是否能通过这一次取第
i
i
i个物品达成条件,并计算概率。
参考代码:code
B Coffee Chicken
签到题
C
题意:给定一个空字符串,每次可以在给定字符串前面或者后面加一个字符,对于每次修改,查询有多少个循环节,最后一个循环节不完全的也可以。
分析:对于给定字符串,判断是否存在长度为
x
x
x的循环节,只需要判断hash值,
s
[
l
,
r
−
x
]
s[l,r-x]
s[l,r−x]和
s
[
l
+
x
,
r
]
s[l+x,r]
s[l+x,r]是否相等即可,我们知道循环节存在也满足单调性,二分即可
参考代码:code
D
扩展中国剩余定理,用python
E Hilbert Sort
递归
F Popping Balloons
做法较多,我才用线段数维护
G Road Construction
题意: 找到一条直线将平面内的点分成两半,并且离最近点的距离最远
分析
直线一定与两个点的连线平行或者垂直,枚举直线的斜率,然后求每个点到直线的距离,找到中间的两个点即可
参考代码code
H Stammering Chemists
模拟
J Wood Processing
题意: 给定n个木块,将木块分成k个部分,把每个部分都砍成一样高,求最少需要砍的面积是多少
分析: 按照高度排序,然后斜率优化进行dp