1 题目描述
假设海岸是一条无限长的直线,陆地位于海岸的一侧,海洋位于另外一侧。
每个小岛都位于海洋一侧的某个点上。
雷达装置均位于海岸线上,且雷达的监测范围为
我们使用笛卡尔坐标系,定义海岸线为
现在给出每个小岛的具体坐标以及雷达的检测范围,请你求出能够使所有小岛都被雷达覆盖所需的最小雷达数目。
输入格式
第一行输入两个整数
接下来
同一行数据之间用空格隔开。
输出格式
输出一个整数,代表所需的最小雷达数目,若没有解决方案则所需数目输出 -1。
数据范围
输入样例:
3 2
1 2
-3 1
2 1
输出样例:
2
2 解析
区间选点 板子。
启发式策略:
- 区间按右端点升序排序。
- 对于当前未选点的区间,以它的右端点作为我们选择的点:
- 之后所有左端点小于该点的区间都被该点覆盖。
- 对于第一个未被该点覆盖的区间,重复上述操作。
证明:
按照上述做法,我们选择的点都是某个区间的右端点,而且由于区间按右端点排好序了,所以我们选择的点也是排好序的。
只有在当前区间和上一个点所对应的区间是没有交集时,我们才会选择一个新点,所以所有选出的点所对应的区间两两之间没有交集。
找到了
完整证明见下文区间选点为什么贪心最优。
int cnt = 0;
sort(seg + 1, seg + n + 1);
double pos = -1e9;
for (int i = 1; i <= n; i ++ )
{
if (pos + eps < seg[i].l)
{
cnt ++ ;
pos = seg[i].r;
}
}
3 区间选点为什么贪心最优
题目:Radar Installation AcWing112
对于这个问题的抽象:
- 多个区间,添加最少点,使得每个区间都含有点。
- 最少点使得多个区间含有点。
- 区间选点问题。
3.1 基本思路
区间
每个区间都可以看成一个集合,这个问题就变成了使用最少的元素,使得每个集合都至少含有一个元素(决策集合)。
对于任意关系的集合
-
情况 1:如果有
个集合,且这 个集合的交集不为空,那么答案集合就是这 个集合的交集。 -
情况 2:
个集合的交集是空集,如下图所示,答案集合是两个集合: 
-
结论:当你做出一个答案集合
之后,如果能更小(发现和另一个答案集合 有交集,那么答案就是 ),那就更小。
对于某个集合
- 使用集合
和其他集合 尝试进行交集运算,得到的最小非空集合就是答案集合。 , ,那么 集合里面的元素就是我们所要找的和 集合交起来非空的那些集合。 - 这样的话,我们把
集合里的元素全部打上标记,从原集合里面去除,在剩余的集合里面再去按照这个方法去寻找。 - 总体时间复杂度为
。
3.2 优化
上面的时间复杂度为

如果我们可以对所求的集合进行排序,使得属于同一个 A B C D,C B A D。
那么我们就可以从头到尾进行遍历,因为集合的交集运算是一种迭代运算,当我们算到某一步,发现交集为空时,我们就得到了一个答案。
那么这个排序后的序列,后面的问题就可以作为一个整体问题,这显然是一种 DP 或者是分解子问题的思想。
回到这一个区间选点问题,如果我们对区间进行排序(先按照区间的起始位置,然后再按照区间的结束位置),我们能够保证交在一起的区间都在一起吗?

对于排序后的第一个区间
- 情况一:两个区间没有公共部分,则第一个区间和后边的所有的区间都不会有公共部分,此时去除第一个区间之后,问题变成一个新的子问题。
- 情况二:第一个区间和第 2 个区间有交集(存在公共部分):
- 根据上面的推导:则这个答案区间一定是这两个区间的交集
。 - 此时此刻第 1 个区间和第 2 个区间可以从数轴上删除,添加一个新的区间,也就是他们俩的交集
,显然并不会影响最终答案。 - 重复执行操作 2,直到变成情况一,此时就会得到第一个答案区间,也就是区间
所对应的答案区间。
- 根据上面的推导:则这个答案区间一定是这两个区间的交集
- 显然,上面这种操作是递归,根据所学知识,所有的递归都是可以使用数学归纳法来证明(上面的整个过程显然是正确的)。
由此,我们证明完毕我们的贪心过程。
还有一个重要的结论:会枚举每一个区间,所以不会漏。
4 相关题解
暂无相关题解