P1325 雷达安装

news/2025/1/9 22:40:19/文章来源:https://www.cnblogs.com/IronMan-PZX/p/18663027

P1325 雷达安装

题目

假设海岸线是一条无限延伸的直线。它的一侧是陆地,另一侧是海洋。每一座小岛是在海面上的一个点。雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围 \(d\)。你的任务是建立尽量少的雷达站,使所有小岛都在扫描范围之内。

数据使用笛卡尔坐标系,定义海岸线为 \(x\) 轴。在 \(x\) 轴上方为海洋,下方为陆地。

输入

第一行包括 \(2\) 个整数 \(n\)\(d\)\(n\) 是岛屿数目,\(d\) 是雷达扫描范围。

接下来 \(n\) 行,每行两个整数,为岛屿坐标。

输出

一个整数表示最少需要的雷达数目,若不可能覆盖所有岛屿,输出 -1

样例

输入

3 2
1 2
-3 1
2 1

输出

2

提示

样例 1 解释

数据范围

对于全部数据,\(n\le1000\),$ d \le 2\times 10^4\(,\) | x_i | \le 2 \times 10^6 \(,\) 0 \le y_i \le 2\times 10^4$。


思路

在解决本题之前,先分析一下区间选点问题:

数轴上有 \(n\) 个闭区间 \(\lbrack a_i,b_i \rbrack\)。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。

  1. 比较容易想到:如果有一大一小区间,由于小区间被满足时大区间一定也被满足,所以在区间包含的情况下,大区间不需要考虑。(如上图。)

  1. 上述两种情况同时可以引发思考,如何对区间进行排序?假设按照区间右端点进行排序。如上图,则应该选择区间 \(1\) 的右端点 \(b_1\) 作为基准值(尽量更右),一旦区间 \(2\) 的左端点 \(a_2\) 大于 \(b_1\) 时,则说明增加一个点覆盖 \(b_2\),且更新基准值为 \(b_2\) 供后面的区间进行比较。如果区间 \(2\) 的左端点 \(a_2\) 小于等于 \(b_1\),则不需要增加新的点覆盖,基准值依然为 \(b_1\)

  2. 当进行右端点排序时,如果右端点相同,那么该如何选点?为保持相同的规律,依然选择上一个区间的右端点,左端点可任意排序。

接下来回归本题,通过分析发现该题目本质上是一个区间点覆盖问题,采用贪心策略,题目中说雷达必须安装到陆地上(包括海岸线),可以很容易地想到,对于每个不在海岸线上的雷达 \(A\),和它的横坐标相同的海岸线上的雷达 \(B\) 的海面探测范围一定包含 \(A\) 的探测范围,因此,雷达一定要建在海岸线上。题目要求每个岛屿都要覆盖到,雷达的探测距离为 \(d\),一个雷达想要探测到它,必须和它的距离小于等于 \(d\)

由勾股定理 \(d^2=s^2+y^2\) 推出探测到一个岛屿 \(I(x,y)\) 的海岸线区间为 \(\lbrack x-\sqrt{d^2-y^2},x+\sqrt{d^2-y^2}\rbrack\),这样每个岛屿都对应一个区间。我们需要在 \(x\) 轴上取尽量少的点,使每个区间上都至少有一个点,于是问题转换为区间点覆盖问题。按照区间右端点升序排序,如果右端点相同,按照区间左端点升序排序或降序排序。记录第一个区间右端点 \(nx\),枚举之后的区间,若区间左端点小于 \(nx\),继续枚举,否则答案累加 \(1\),且更新 \(nx\) 为当前区间右端点。


代码

#include <bits/stdc++.h>using namespace std;const int N = 1000006;
int n, ans = 1, nx;
double d;struct Range
{double a, b;Range(){}Range(double x, double y){a = x;b = y;}
} r[N];bool cmp(Range x, Range y)
{if (x.b < y.b)return 1;else if (x.b == y.b && x.a > y.a)return 1;return 0;
}int main()
{scanf("%d %lf", &n, &d);double a, b;for (int i = 1; i <= n; i ++ ){scanf("%lf %lf", &a, &b);if (b <= d)r[i] = Range(a - sqrt(d * d - b * b), a + sqrt(d * d - b * b));// 转换成区间问题else{printf("-1");return 0;}}sort(r + 1, r + 1 + n, cmp);nx = r[1].b;for (int i = 2; i <= n; i ++ ){if (r[i].a > nx){ans ++;nx = r[i].b;}}printf("%d", ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/866795.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第4章 类型设计准则

第4章 类型设计准则​DO​:类应该由一组定义明确、相互关联的成员组成。 一个类,如果能用一句话描述清楚它的用途,那么它的设计是优秀的。1 类型(class、struct)和 namespace​DO​:namespace 用于组织类,通过 namespace 将相关功能按层次铺开,但不要有过深的层次、过多…

BurpSuite实操之代理功能

一、代理原理Burp Suite代理工具是以拦截代理的方式,拦截所有通过代理的网络流量,如客户端的请求数据、服务器端的返回信息等。通过拦截,Burp Suite以中间人的方式,可以对客户端请求数据、服务端返回做各种处理,以达到安全评估测试的目的。在日常工作中,我们最常用的web客…

window11安装安卓子系统,畅玩安卓软件

在Windows 11刚推出时,微软便宣称该操作系统中可以直接安装运行安卓APK应用程序,如同Android虚拟机一样,不过是要实现这一功能,我们必须在Windows 11中单独安装Windows 11安卓子系统,这里说明一下其标准的名称为:适用于 Android™️ 的 Windows 子系统(Windows Subsyste…

Python + Appium 自动化操作微信入门(超详细)

Appium是一个开源的自动化测试工具,支持 Android、iOS 平台上的原生应用,支持 Java、Python、PHP 等多种语言。Appium是一个开源的自动化测试工具,支持 Android、iOS 平台上的原生应用,支持 Java、Python、PHP 等多种语言。 Appium 封装了 Selenium,能够为用户提供所有常见…

浅谈STC单片机看门狗的作用和使用成都控制器开发

有的控制器的运行环境是很复杂的,比如可能突然来个电压,突然来个浪涌,周围存在的强电磁场也可能交替对控制器造成冲击,也有可能外部器件出现错误很久不响应,这样就有可能让单片机的程序跑飞,或者进入死循环出不来,那这就完蛋了。怎么办呢? 一个简单的办法就是使用单片机…

【云计算】银行数据中心私有云平台2.0建设(来自真实案例,很有启发性)

【导读】某行数据中心私有云平台一期建设后投入使用。但在使用过程中遇到了诸多实际问题:审批流程不贴合实际情况、自动化程度较低、云平台无法与CMDB联动、裸金属纳管等。本文对问题根源进行了探讨,并分享了通过对资源管理模式、审批流程、资源部署、微服务部署等方面进行优…

markdown学习记录

markdown学习 标题 标题用“#” 字体 这是加粗(两个星号) 这是倾斜(一个星号) 加粗+倾斜(三个星号) 这是删除线 (两个~~) 引用大于号是引用分割线(“---”或“***”) 插入图片 !+[名称]+(URL)超链接 [地址名]+(网址) 我的博客地址 列表 有序用数字,无序用“-”号A…

【实用技巧】【探讨】Java 中比较两个对象的差异

1 前言 大家平时写业务代码的时候,应该能感知到哪些是基础配置数据,哪些是实例数据。比如营销里的活动信息、促销信息就属于配置型数据,基于活动带来的订单参与活动信息属于实例数据。比如一些规则信息、流程信息等类似一种版本的概念。那么版本跟版本之间的差异、以及创建…

主机与虚拟机互ping不通的解决办法

一、主机ping不通虚拟机,但虚拟机可以ping主机 解决办法:二、虚拟机ping不通主机,但主机可以ping虚拟机 解决办法: 这里说的第一点我不知道,我是虚拟机可以ping通百度,之前虚拟机有过相关配置 我这里主要是win11电脑网络连接这里开启防火墙下面简单的说明下Vmware的网络连…

Win32汇编学习笔记09.SEH和反调试

Win32汇编学习笔记09.SEH和反调试-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net SEH - structed exception handler 结构化异常处理 跟筛选一样都是用来处理异常的,但不同的是 筛选器是整个进程最终处理异常的函数,但无法做到比较精细的去处理异常(例如处理…

【Windows攻防】Windows注册表 IFEO注入

介绍 IFEO 注入攻击是一种基于注册表的攻击技术,几乎可以保证以登录用户甚至管理员/系统用户的身份执行代码。在任何你可以想象的用例中,如果你想要将你的有效载荷绑定到 Windows 平台上二进制文件的“启动”,IFEO(图像文件执行选项)可能是你最好的选择。这是一种开发人员…

[Java] 计算Java对象大小

序在Java应用程序的性能优化场景中,时常需要考虑Java对象的大小,以便评估后,进一步提出优化方案:占用内存的大小。(比如 本地内存) 对象数据在网络传输中占用的网络带宽 对象数据在存储时占用的磁盘空间 ...概述 对象大小如何计算对象大小包括俩部分的内容,对象头和对象…