test 200502

test 200502

T1 商店购物

得分情况

期望:0

实际:0

改后:100

题意

​ 在 Byteland 一共开着 n 家商店,编号依次为 1 到 n,其中编号为 1 到 m 的商店有日消费量上限,第 i 家商店的日消费量上限为 w i 。
​ Byteasar 每次购物的过程是这样的:依次经过每家商店,然后购买非负整数价格的商品,并在结账的时候在账本上写上在这家商店消费了多少钱。当然,他在这家商店也可以什么都不买,然后在账本上写上一个 “0”。
​ 这一天,Byteasar 日常完成了一次购物,但是他不慎遗失了他的账本。他只记得自己这一天一共消费了多少钱,请写一个程序,帮助 Byteasar 计算有多少种可能的账单。

犯傻原因

​ 可能一开始推公式没什么思路就直接跳过了,后来一直在调试后面的题目就没怎么管了。

正解

考虑 DP,设 \(f[i][j]\) 表示考虑了前 i 个商店,目前选的商店的上限 +1 之和为 \(j\) 时的贡献。

如果这个商店不选,那么有 \(f[i][j]+ = f[i − 1][j]\),否则有\(f[i][j]− = f[i − 1][j − w[i] − 1]\)

\(\sum ans = \sum_i f[n][i]C_{k + n − 1 − i}^{ n − 1}\)

时间复杂度 \(O(n + k + m^2 w)\)

T2 公路建设

得分情况

期望:30

实际:30

改后:100

题意

在 Byteland 一共有 \(n\) 个城市,编号依次为 \(1\)\(n\) ,它们之间计划修建 \(m\) 条双向道路,其中修建第\(i\) 条道路的费用为 \(c_i\)

Byteasar 作为 Byteland 公路建设项目的总工程师,他决定选定一个区间 [l, r],仅使用编号在该区间内的道路。他希望选择一些道路去修建,使得连通块的个数尽量少,同时,他不喜欢修建多余的道路,因此每个连通块都可以看成一棵树的结构。

为了选出最佳的区间,Byteasar 会不断选择 \(q\) 个区间,请写一个程序,帮助 Byteasar 计算每个区间内修建公路的最小总费用。

犯傻原因

就一直在那推可能的算法,预处理什么的都想了想还是没想到怎么实现,然后就凉凉写了个暴力了……

正解

考虑用线段树直接维护每个区间的答案。

注意到一个区间最多只有 \(n − 1\) 条树边有用,所以线段树每个节点按权值从小到大保存区间内用到的树边即可。

合并两个区间的信息时,只需要将树边归并,然后做Kruskal 算法。

时间复杂度 \(O((m + q \log m)n \alpha(n))\)

T3 航海舰队

得分情况

期望:30

实际:20

改后:

题意

Byteasar 组建了一支舰队!他们现在正在海洋上航行着。

海洋可以抽象成一张 \(n \times m\) 的网格图,其中有些位置是 “.”,表示这一格是海水,可以通过;有些位
置是 “#”,表示这一格是礁石,不可以通过;有些位置是 “o”,表示这一格目前有一艘舰,且舰离开这
一格之后,这一格将变为 “.”。

这些 “o” 表示 Byteasar 的舰队,他们每天可以往上下左右中的一个方向移动一格,但不能有任何一
艘舰驶出地图。

特别地,Byteasar 对阵形有所研究,所以他不希望在航行的过程中改变阵形,即任何时
刻任何两艘舰的相对位置都不能发生变化。

Byteasar 的舰队可以航行无限长的时间,每当一艘舰经过某个格子的时候,这个格子海底的矿藏都
将被 Byteasar 获得。

请写一个程序,帮助 Byteasar 计算他最多可以获得多少个格子海底的矿藏?

犯傻原因

大概还是不会……

写了个暴力……

然后30-60分没来得及打完就考试结束了就放弃了……

然后还不知道为什么无缘无故T了一个点真的服了自己

正解

首先抠出包围了阵形的最小矩形。

将地图拉伸成一条链,即将第一行、第二行、第三行按顺序连接。阵形也可以用同样的方法处理。

那么问题转化为,给定两个 01 串 S 和 T,问每个 S 中长度为 |T| 的子串是否存在一个点,两个串对应字符都是 1。

将 T 串翻转,那么就变成了卷积的形式,FFT 计算即可。

在 BFS 求出所有可行的位置之后,对于答案的计算,也是卷积的形式,用 FFT 加速即可。

时间复杂度 \(O(nm \log(nm))\)

考试总结

想题目的时候思路要清晰些,题目思路断了可能导致浪费很长的的一段时间。

posted @ 2020-05-02 17:01  ztz_cpp  阅读(173)  评论(0编辑  收藏  举报