2025.1.4
match
估分: \(100+100+100+30=330\)
实际: \(100+100+100+10=310\)
总结:打得还好,但 T4 爆搜写错了,设了DP推不出来,流泪\fn
简要题解
T1
注意到 \(a+b=n\),直接贪心。
如果 \(a_i-b_i\) 大,那么就选他的物理成绩,如果否则选他的生物成绩。
code
T2
考虑树形DP。
定义 \(dp_i\) 指根节点为 \(i\) 的子树最多能放多少个咖啡厅的个数,那么显然有 \(dp_u=\sum dp_v\),其中 \(v\) 是 \(u\) 的儿子。
但这样转移会出错,因为当 \(u\) 有儿子为叶子节点时,我们并没有计算。
因此我们只需要统计叶子节点的个数(包括本节点)对半分后累加给 \(dp_u\) 即可。
code
赛时写麻烦了,用 bool 判断叶子节点。浪费 \(5 \min\)\fn。
T3
可以把转表的过程看作状态。
此时有两种做法:
- 跑 bfs 求每个点的答案。
- 把状态转移看作建边,跑单源最短路即可。
赛时写了第 \(2\) 种做法。
code
T4
赛时问题想得不透彻,没有大胆设状态。
转换题意:有 \(n\) 个数,要从中选出 \(k\) 个,将它们分为若干段,要求每段的和不能超过 \(119\),求分段数的最小值。
考虑DP。
定义 \(dp_{i,j}\) 表示前 \(i\) 个物品选了 \(j\) 件,但这时候无法转移。因为不知道最后一个阶段的和是多少。
因此我们可以大胆多开一个数组 \(dp2_{i,j}\) 表示前 \(i\) 个物品选了 \(j\) 件时最后一个阶段最小值是多少。
那么易得方程。如果不选,那么 \(dp_{i,j}\) 可以继承 \(dp_{i-1,j}\)。如果选,那么更新即可。
还要注意边界条件。\(dp{i,1}=1,dp2_{i,1}=min(dp2_{i-1,1},a_i)\)。
code