ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-03-20 12:35:15  阅读:285  来源: 互联网

标签:端点 交集 小岛 当前 区间 雷达 贪心


文章目录

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有