Loading

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)\)

posted @ 2023-03-10 23:23  chengning0909  阅读(16)  评论(0编辑  收藏  举报