题目在这里:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050e01
代码在这里:https://github.com/dezhonger/kick-start/tree/master/20190324
A : T r a i n i n g A: Training A:Training
题 意 : 一 个 大 小 为 n 个 数 组 选 出 m 个 数 , 可 以 进 行 的 操 作 为 给 一 个 数 加 一 , 为 了 可 以 选 出 m 个 相 等 的 数 , 求 需 要 加 的 最 小 值 是 多 少 ? 题意:一个大小为n个数组选出m个数,可以进行的操作为给一个数加一,为了可以选出m个相等的数,求需要加的最小值是多少? 题意:一个大小为n个数组选出m个数,可以进行的操作为给一个数加一,为了可以选出m个相等的数,求需要加的最小值是多少?
S o l u t i o n : 排 序 + 前 缀 和 , 枚 举 。 Solution: 排序+前缀和,枚举。 Solution:排序+前缀和,枚举。
复 杂 度 为 O ( N ) 复杂度为O(N) 复杂度为O(N)
B : C o n t e n t i o n B: Contention B:Contention
一 个 长 度 为 N 的 座 位 , N 个 查 询 , 每 次 要 得 到 [ L , R ] 的 座 位 ( 如 果 其 中 有 些 位 置 已 经 被 之 前 的 拿 走 了 , 那 么 就 只 能 拿 剩 余 的 位 置 ) , 怎 么 安 排 顺 序 使 得 拿 到 最 小 的 位 置 的 数 量 最 大 。 一个长度为N的座位,N个查询,每次要得到[L, R]的座位(如果其中有些位置已经被之前的拿走了,那么就只能拿剩余的位置),怎么安排顺序使得拿到最小的位置的数量最大。 一个长度为N的座位,N个查询,每次要得到[L,R]的座位(如果其中有些位置已经被之前的拿走了,那么就只能拿剩余的位置),怎么安排顺序使得拿到最小的位置的数量最大。
S o l u t i o n : 不 会 做 。 Solution: 不会做。 Solution:不会做。
官 方 正 解 似 乎 是 贪 心 + 线 段 树 , 但 是 感 觉 不 对 , 看 别 人 的 做 法 都 是 二 分 。 。 。 官方正解似乎是贪心+线段树,但是感觉不对,看别人的做法都是二分。。。 官方正解似乎是贪心+线段树,但是感觉不对,看别人的做法都是二分。。。
C : P a r c e l s C:Parcels C:Parcels
一 个 N ∗ M 的 01 矩 阵 , 可 以 选 择 其 中 一 个 的 0 变 为 1 ( 也 可 以 不 选 ) , 求 所 有 为 0 的 点 到 1 的 曼 哈 顿 距 离 最 大 的 值 最 小 为 多 少 ? 一个N*M的01矩阵,可以选择其中一个的0变为1(也可以不选),求所有为0的点到1的曼哈顿距离最大的值最小为多少? 一个N∗M的01矩阵,可以选择其中一个的0变为1(也可以不选),求所有为0的点到1的曼哈顿距离最大的值最小为多少?
S o l u t i o n : Solution: Solution:
先 b f s 算 出 最 大 值 , 然 后 二 分 。 先bfs算出最大值,然后二分。 先bfs算出最大值,然后二分。
假 设 距 离 为 k , 到 点 P ( x , y ) 距 离 为 k 的 点 为 一 个 旋 转 π / 4 的 正 方 形 , 计 算 出 四 条 直 线 的 表 达 式 。 假设距离为k,到点P(x, y)距离为k的点为一个旋转π/4的正方形,计算出四条直线的表达式。 假设距离为k,到点P(x,y)距离为k的点为一个旋转π/4的正方形,计算出四条直线的表达式。
枚 举 所 有 距 离 大 于 k 的 点 , 求 出 各 个 正 方 形 的 交 集 的 表 达 式 , 实 际 上 就 是 求 点 P ( x , y ) 的 表 达 式 x + y 的 范 围 和 x − y 的 范 围 , 最 后 判 断 矩 阵 中 是 否 有 元 素 在 这 个 结 果 里 即 可 。 枚举所有距离大于k的点,求出各个正方形的交集的表达式,实际上就是求点P(x,y)的表达式x+y的范围和x-y的范围,最后判断矩阵中是否有元素在这个结果里即可。 枚举所有距离大于k的点,求出各个正方形的交集的表达式,实际上就是求点P(x,y)的表达式x+y的范围和x−y的范围,最后判断矩阵中是否有元素在这个结果里即可。
复 杂 度 : N M l o g ( N + M ) 复杂度:NMlog(N+M) 复杂度:NMlog(N+M)