kickstart 2019

题目在这里: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)

 

 

 

你可能感兴趣的:(比赛)