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