ABC 317 A - G
ABC 317 A - G
代码去 Atcoder 全部提交搜索 Std_Code 查看代码
A
$ p_i $ 升序,找最小的 $ i $ 满足 $ p_i + h \ge x $
直接枚举所有 $ p_i $ 即可,考虑到保证有解,所以我们可以不考虑枚举完干什么
也可以随便输出,比方说 $ AK $ 个 $ 101 $ 之类的
B
给几个数字,是连续数字去掉其中一个,找到去掉的数字
我们考虑记录每个数字是否出现,找出所有数字里面的最小数字,和最大数字,在这些数字里面枚举,如果没有出现就直接输出
另一种方法,排序以后找一下那一个数比之前的数大了不止 $ 1 $
C
求一个 $ n $ 点 $ m $ 边无向图的最长简单路径
很简单,直接 dfs 就可以了,每次枚举所有边,找边权最大的返回
其实肥肠的简单,但是我就是赛时想了很久才想出来
D
从这道题开始就有难度了,这是一道标准的 $ 01 $ 背包题
我们把背包的容量看成座位数,设 $ dp_i $ 表示令座位数为 $ i $ 的最少需求人数
然后枚举每个场地进行转移即可,和 $ 01 $ 背包是一样的
这里要先预处理出所有场地的总座位数和初始本来就是自己的的座位数
然后除了初始的座位数以外,所有的 $ dp_i $ 是 $ 10^{18} $
这里要注意,$ 2147483647 $ 是不行的,会 WA $ 9 $ 个点,不要问我是怎么知道的
然后就没什么难的了
E
给一个地图,有人,人有视线,还有障碍物,求从起点到终点不被看见能否做到
很简单,先求出能被人看到的格子,标记
然后把这些格子和人全变成障碍物
然后 BFS 直接大爆搜就可以了
很简单,超级简单,正常人赛时直接秒
F
F 是数位 dp
题意是说找三元组 $ (x_1, x_2, x_3) $ 的数量,满足分别是 $ A, B, C $ 的倍数,并且相互异或是 $ 0 $,三个数在 $ n $ 的范围内
我们考虑 $ dfs(k, x, y, z, f_1, f_2, f_3, f_4, f_5, f_6) $
前三个参数表示上界,后三个参数表示是不是 $ 0 $
然后发现,每一位只能取 $ 2 $ 个 $ 1 $,或者都取 $ 0 $
然后直接 dfs 就可以了,每次枚举那些取 $ 1 $,和全取 $ 0 $ 的方案数之和,返回即可
记得对应更新一下参数就可以了
其实没什么难的
G
网络流来送温暖啦
给定一个 $ n \times m $ 的数组 $ a $,求能否把每一行重新排序,使得每一列 $ 1 $ ~ $ n $ 都各出现一次
我们考虑行号和这一行所有的数连边
然后跑一个二分图最大匹配就可以找到一列的方案,
然后把找到的边去掉
最后判断能否找到 $ m $ 个最大匹配就可以了
很简单,代码也不难写