其他分享
首页 > 其他分享> > 雷达设备(贪心:区间问题)

雷达设备(贪心:区间问题)

作者:互联网

文章目录

Question

假设海岸是一条无限长的直线,陆地位于海岸的一侧,海洋位于另外一侧。

每个小岛都位于海洋一侧的某个点上。

雷达装置均位于海岸线上,且雷达的监测范围为 d,当小岛与某雷达的距离不超过 d 时,该小岛可以被雷达覆盖。

我们使用笛卡尔坐标系,定义海岸线为 x 轴,海的一侧在 x 轴上方,陆地一侧在 x 轴下方。

现在给出每个小岛的具体坐标以及雷达的检测范围,请你求出能够使所有小岛都被雷达覆盖所需的最小雷达数目。

输入格式
第一行输入两个整数 n 和 d,分别代表小岛数目和雷达检测范围。

接下来 n 行,每行输入两个整数,分别代表小岛的 x,y 轴坐标。

同一行数据之间用空格隔开。

输出格式
输出一个整数,代表所需的最小雷达数目,若没有解决方案则所需数目输出 −1。

数据范围
1≤n≤1000,
−1000≤x,y≤1000
输入样例:
3 2
1 2
-3 1
2 1
输出样例:
2

Ideas

考虑每个小岛被探测到需要雷达安在哪的区间,求所有没有交集区间的个数
所谓的笛卡尔坐标系就是正常数学坐标系
贪心策略:
1.按照右边界将区间排序
2.如果上一个区间的右端点不在当前区间里,选择当前区间的右端点(说明当前区间与上一个区间无交集)
如果上一个区间的右端点在当前区间里(>=当前区间的左端点),则跳过(说明当前区间与上一个区间有交集)

Code

# 考虑每个小岛被探测到需要雷达安在哪的区间,求所有没有交集区间的个数
# 所谓的笛卡尔坐标系就是正常数学坐标系
'''
贪心策略:
    1.按照右边界将区间排序
    2.如果上一个区间的右端点不在当前区间里,选择当前区间的右端点(说明当前区间与上一个区间无交集)
      如果上一个区间的右端点在当前区间里(>=当前区间的左端点),则跳过(说明当前区间与上一个区间有交集)
'''
n,d = list(map(int,input().strip().split()))
lis = [] # 存储所有区间
# 求所有区间
is_fail = False
for i in range(n):
    x,y = [int(i) for i in input().split()]
    if y > d:
        is_fail = True
        break
    dx = (d**2 - y**2) ** 0.5 
    lis.append((x-dx,x+dx))
if not is_fail:
    # 按照区间的右端点排序
    lis.sort(key=lambda x:(x[1],x[0])) # 按照右端点排序写法
    # print(lis)
    last = float('-inf') # 上一个区间右端点
    cnt = 0 # 统计个数
    for i in lis:
        if i[0] <= last:
            continue
        else:
            # print('hehi')
            last = i[1]
            cnt += 1
    print(cnt)
else:
    print(-1)

标签:端点,交集,小岛,当前,区间,雷达,贪心
来源: https://blog.csdn.net/qq_49821869/article/details/123610571