首页 > 其他分享 >P1325 雷达安装

P1325 雷达安装

时间:2025-01-09 22:43:33浏览次数:1  
标签:P1325 海岸线 nx 端点 区间 雷达 排序 安装

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;
}

标签:P1325,海岸线,nx,端点,区间,雷达,排序,安装
From: https://www.cnblogs.com/IronMan-PZX/p/18663027

相关文章

  • [Arch Linux]系统安装教程2025
    #查看磁盘状况lsblk-f #进入xxx硬盘来分区cfdisk/dev/xxx 硬盘格式GPT新建EFI分区,300-500M,类型为EFI新建交换分区,类似虚拟内存,swap,通常为4G剩下全部为根目录分区,默认类型选择write,输入yes确定,quit退出#查看分好区的硬盘fdisk-l mkfs.ext4/dev/     ......
  • window11安装安卓子系统,畅玩安卓软件
    在Windows11刚推出时,微软便宣称该操作系统中可以直接安装运行安卓APK应用程序,如同Android虚拟机一样,不过是要实现这一功能,我们必须在Windows11中单独安装Windows11安卓子系统,这里说明一下其标准的名称为:适用于Android™️的Windows子系统(WindowsSubsystemforAndroid™️,简称......
  • iOS 17.0如何无需签名一键安装巨魔的教程
    iOS17.0如何无需签名一键安装巨魔商店2教程......
  • (超详细)Maven安装配置、以及在IDEA中创建Maven项目
    一、登录官网下载MavenDownloadApacheMaven–Maven根据自己所需要进行下载,如果是windows系统就下载zip文件,Linux系统就下载gz文件我下载的版本是3.6.3,下面是网盘链接:百度网盘链接:https://pan.baidu.com/s/1YtoprbKyJJHHForpHptgZA提取码:negv下载后直接解压就行......
  • Baidu Comate的安装以及使用
    BaiduComate是百度智能云推出的一款智能编码助手,基于文心大模型构建,结合百度编程大数据和开源数据,旨在提高开发者的编程效率和质量。以下是对BaiduComate的详细介绍,包括其优缺点:一、功能特点代码推荐与生成:根据开发者的输入和上下文信息,自动生成符合规范的代码片段。支持......
  • Rocky Linux 9.5 安装 MySQL 8.0
    RockyLinux9.5安装MySQL8.0RockyLinux9.5 [root@netkiller~]#dnfinstall-ymysql-server[root@netkiller~]#systemctlenablemysqldCreatedsymlink/etc/systemd/system/multi-user.target.wants/mysqld.service→/usr/lib/systemd/system/mysqld.ser......
  • 2025最新Python安装教程+PyCharm安装教程(超详细!)看这一篇全都搞定!
    Python安装1、首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图中红色圈中区域进行下载。(免下载直接安装......
  • linux8安装oracle 11g遇到的问题记录
    大家都知道oracle11g在linux6或7上安装是没有问题的,但在linux8上安装时在link编译环节会遇见各种问题。按照oracle官网的说法,可直接跳过这些错误,等他安装完毕,然后打补丁,再重新编译即可。官网给出的方案1、InstallOracleDatabase11.2.0.4(softwareonly):Note:Ignoreany......
  • 如何安装python?超详细安装教程!
    首先,请确保你的系统是Windows-64位1.下载Python首先,打开浏览器,我们需要到Python的官方网站在地址栏输入python.org,然后点击页面上的“Downloads”按钮,接着选择适合你电脑系统的版本进行下载。如果是Windows或者Mac的小可爱们,直接下载推荐版本就好啦。小编下载的是python-3.7......
  • centos7安装docker
    1.下载所需yum软件包yuminstall-yyum-utilsdevice-mapper-persistent-datalvm2--skip-broken2.设置docker镜像源yum-config-manager--add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed-i's/download.docker.com/mirrors.aliyun.co......