Acwing---112.雷达设备
雷达设备
- 1.题目
- 2.基本思想
- 3.代码实现
1.题目
假设海岸是一条无限长的直线,陆地位于海岸的一侧,海洋位于另外一侧。
每个小岛都位于海洋一侧的某个点上。
雷达装置均位于海岸线上,且雷达的监测范围为 d,当小岛与某雷达的距离不超过 d时,该小岛可以被雷达覆盖。
我们使用笛卡尔坐标系,定义海岸线为 x 轴,海的一侧在 x轴上方,陆地一侧在 x 轴下方。
现在给出每个小岛的具体坐标以及雷达的检测范围,请你求出能够使所有小岛都被雷达覆盖所需的最小雷达数目。
输入格式
第一行输入两个整数 n和 d,分别代表小岛数目和雷达检测范围。
接下来 n 行,每行输入两个整数,分别代表小岛的 x,y轴坐标。
同一行数据之间用空格隔开。
输出格式
输出一个整数,代表所需的最小雷达数目,若没有解决方案则所需数目输出 −1。
数据范围
1 ≤ n ≤ 1000 1≤n≤1000 1≤n≤1000,
− 1000 ≤ x , y ≤ 1000 −1000≤x,y≤1000 −1000≤x,y≤1000
输入样例:
3 2
1 2
-3 1
2 1
输出样例:
2
2.基本思想
贪心 O(nlogn)
如下图所示,对于任意一个小岛 (x,y)我们都可以在海岸线上求出能覆盖该小岛的建造雷达的区间 [a,b]
由勾股定理可知:
将所有小岛转化成区间后,问题转化为:给定 n 个区间,在 x 轴上选择尽量少的点,使得所有区间至少包含一个点。
算法步骤:
- 1.将所有区间按右端点从小到大排序;
- 依次考虑每个区间:
如果当前区间包含最后一个选择的点,则直接跳过;
如果当前区间不包含最后一个选择的点,则在当前区间的右端点的位置选一个新的点;
- 依次考虑每个区间:
3.代码实现
import java.util.Arrays;
import java.util.Scanner;public class Main {static Scanner sc = new Scanner(System.in);static int N = 1010;static Pair seg[] = new Pair[N];static double esp = 10e-6;static class Pair implements Comparable<Pair> {double l, r;public Pair(double l, double r) {this.l = l;this.r = r;}@Overridepublic int compareTo(Pair o) {return Double.compare(this.r, o.r);}}public static void main(String[] args) throws Exception {int n = sc.nextInt();//小岛数int d = sc.nextInt();//雷达半径for (int i = 1; i <= n; i++) {int x = sc.nextInt();int y = sc.nextInt();if (y > d) {System.out.println("-1");return;}double len = Math.sqrt(d * d - y * y);//每个岛 投射到x轴上的左、右端点seg[i] = new Pair(x - len, x + len);}//对所有区间 排序Arrays.sort(seg, 1, n + 1);int res = 0;double lastNode = Integer.MIN_VALUE; //上一个雷达位置//以上一个点的右端点 判断是否在当前区间的左端点内for (int i = 1; i <= n; i++) {if (seg[i].l > lastNode) { //下一段区间的起始点在上一个雷达的右边 即没有交集 则需要加入新的雷达res++;lastNode = seg[i].r;//更新}}System.out.println(res);}
}
Acwing---112.雷达设备相关推荐
- 112. 雷达设备【贪心】
呢么问题就变成了区间合并问题.给我们n给区间将相交的区间合并求不相交的区间个数. #include<bits/stdc++.h> using namespace std; typedef ...
- 【蓝桥杯专题】 贪心(C++ | 洛谷 | acwing | 蓝桥)
菜狗现在才开始备战蓝桥杯QAQ 文章目录 [蓝桥杯专题] (C++ | 洛谷 | acwing | 蓝桥) 1055. 股票买卖 II AcWing 104. 货仓选址 传递糖果 AcWing 112 ...
- AcWing蓝桥杯AB组辅导课07、贪心
文章目录 前言 一.贪心 模板题 例题1:AcWing 104. 货仓选址(贪心,简单,算法竞赛进阶指南) 分析 题解:贪心思路 例题 例题1:AcWing 1055. 股票买卖 II(贪心.状态机, ...
- ACwing算法基础课全程笔记(2021年8月12日开始重写+优化)
更好的阅读体验 ※基础模板 2021年8月12日开始对基础课笔记进行重写+优化 请大家支持AcWing正版,购买网课能让自己获得更好的学习体验哦~ 链接:https://www.acwing.com/ ...
- AcWing寒假每日一题2058. 笨拙的手指
AcWing寒假每日一题2058. 笨拙的手指 题目描述 奶牛贝茜正在学习如何在不同进制之间转换数字. 但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔. 每当贝茜将数字转换为一个新的进制并写下结果 ...
- AcWing寒假每日一题 2058.笨拙的手指
题目描述:2058. 笨拙的手指 - AcWing题库 奶牛贝茜正在学习如何在不同进制之间转换数字. 但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔. 每当贝茜将数字转换为一个新的进制并写下结果时 ...
- AcWing语法基础课题单
算法养成计划之语法基础 给大一表弟整理的AcWing语法基础课题单 第一讲 变量.输入输出.表达式与顺序语句 第1题 A + Bhttps://www.acwing.com/problem/conte ...
- AcWing Linux基础课
文章目录 常用文件管理命令 常用命令介绍 创建作业 & 测试作业的正确性 作业 tmux和vim tmux教程 vim教程 创建作业 & 测试作业的正确性 作业 shell shell ...
- AcWing 2058.笨拙的手指
原题链接:AcWing 2058.笨拙的手指 关键词: 枚举.位进制 奶牛贝茜正在学习如何在不同进制之间转换数字. 但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔. 每当贝茜将数字转换为一个新的进 ...
- 【ACWing】1120. 埃及分数
题目地址: https://www.acwing.com/problem/content/1122/ 在古埃及,人们使用单位分数的和(形如1a\frac{1}{a}a1的,aaa是自然数)表示一切有 ...
最新文章
- 通过Matrix进行二维图形仿射变换
- oracle json 搜索,oracle 正则查询json返回报文中某个字段的值
- ef 单表一对多集合查询_FILTER函数你用过吗?一对多查询与自动筛选,用它都能轻松搞定...
- 还不会制作游戏脚本解放双手?那是你不会超强自动化框架AirTest!
- [SpringBoot2]Thymeleaf
- LocalDateTime与LocalDate之间的相互转换
- 计算机专业英语霍洪涛出版社,计算机专业英语(霍洪涛)课件Chapter 4.ppt
- 第二章 Qt Widgets项目的创建、运行和发布的过程
- 美团到店综合知识图谱的构建与应用
- C++ std::set insert 失败 原因和解决方案 operator
- property_自己编写一个读取Property文件的Util类
- 概率论与数理统计 答案
- 腰围尺寸2尺1、2、3、4、5、6、7、8寸分别等于是多少厘米/英寸(对照参考表)
- html 页面没有鼠标,网页上鼠标箭头不见了 电脑上不显示鼠标箭头怎么办?
- (四)下载利器aria2
- 3 linux禁用ssl_linux – Poodle:在服务器上禁用SSL V3真的是一个解决方案吗?
- 基于华为高端NAS存储双活的POC测试
- 博客已死?移动互联网时代博客的价值
- Aho-Corasick自动机算法
- cat /etc/sysconfig/network-scripts/ifcfg-ens33
热门文章
- 北京地铁:充分发挥数据价值,全面提升业财融合能力
- git下载安装教程(附带安装包2019年6月版本 Git 2.22.0)
- 这样做生意是亏了还是赚了
- MySQL with语句小结
- cetus权限连接主从mysql_cetus/cetus-rw.md at master · sea009/cetus · GitHub
- 3款吃鸡不卡顿的国产手机,用了都说好,很值!
- 第一颗国产 四端口 LVDS 至 HDMI2.0,带音频 芯片 LT2611UX
- [树hash]BZOJ 4337——BJOI2015 树的同构
- “知识屏蔽“是什么?阅读知识屏蔽的书有什么好处?
- 深度图结合RGB实现行为识别