CF1066B 题解
CF1066B
题意
有 \(n\) 个位置,可以在某些位置放一盏灯,假设在 \(x\) 放了一盏灯,那么 \([x - r + 1, x + r - 1]\) 都可以被照亮。
所有位置都想被照亮,最少需要放多少盏灯。如果无解,输出 -1。
\(1 \le n, r \le 1000\)
思路
做法 1
我们先考虑这样一个问题,如果 \(i\) 没有被照亮,那么 \([i - r + 1, i + r - 1]\) 可以照亮它,这是很明显的。
并且,如果有很多个点可以照亮 \(i\),肯定是选择下标最大的,这样做的话可以使得被照亮的点更多,也就是使得答案更优。
所以,就有了这样一个做法。
每次寻找第一个没有被照亮的点,枚举可以照亮当前点的所有点,取下标最大并且可以放灯的的点。
时间复杂度为 \(O(n \times r)\)。
做法 2
因为有的点可以放灯,有的不行,所以我们可以预处理出所有照亮区间。
也就是说,如果 \(i\) 可以放灯,那么就多了一个左端点为 \(i - r + 1\),右端点为 \(i + r - 1\) 的照亮区间。
最后用所有照亮区间做一次区间覆盖即可。
区间覆盖
贪心。
令 \(last\) 为当前最后一个被照亮的点。
将所有区间按照左端点排序,每次选择左端点 小于等于\(last + 1\),且右端点最大的区间。
因为在本题中所有区间的左端点一定是有序的,所以省掉了排序的时间复杂度。
而最多有 \(n\) 个区间,总时间复杂度为 \(O(n)\)。