文章目录
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)










