雷达设备(贪心:区间问题)
作者:互联网
文章目录
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