博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YbtOJ——贪心算法【例题2】雷达装置
阅读量:2154 次
发布时间:2019-04-30

本文共 1146 字,大约阅读时间需要 3 分钟。

B. 【例题2】雷达装置

内存限制:64 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较

题目描述

有 个建筑物,第 个建筑物在笛卡尔坐标系上的坐标为 ,你需要在 轴上安装一些雷达,每个雷达的侦察半径均为 ,要求每个建筑物都至少被一个雷达侦测到,求最少要安装几个雷达。

输入格式

第一行两个正整数 。

接下来 行,第 行两个整数 。

输出格式

输出一行表示答案,若没有解决方案,则答案为 。

样例

样例输入

3 2

1 2
-3 1
2 1

样例输出

2

数据范围与提示

对于 % 100 \%100 %100 的数据,有 1 ≤ N ≤ 1 0 3 1\leq N\leq10^3 1N103

思路

先画个图感性理解一下:

在这里插入图片描述
能检测到点(x,y)的雷达只能在圆圈内,而在x轴内的雷达就只在 [l,r] 区间内了。
由勾股定理得: d 2 = ( x − l ) 2 + y 2 = ( r − x ) 2 + y 2 d^2=(x-l)^2+y^2=(r-x)^2+y^2 d2=(xl)2+y2=(rx)2+y2
所以 d 2 − y 2 = x − l = r − x \sqrt{d^2-y^2}=x-l=r-x d2y2 =xl=rx
所以 l = x − d 2 − y 2 , r = x + d 2 − y 2 l=x-\sqrt{d^2-y^2},r=x+\sqrt{d^2-y^2} l=xd2y2 r=x+d2y2
所以我们就能求出每个点对应的区间,
然后问题就变成在n个区间里放最少的点,使得每个区间里都有点。
贪心策略为:
将区间按右端点从小到大排序,
然后枚举每个区间,若这个区间里有雷达(即最近放的雷达在左端点的右边),则不管它。
否则,放一个雷达在这个区间的右端点。
证明省略······

代码

#include
#include
#include
#define ll long longusing namespace std;ll n,ans;double x,y,d,t;struct node{
double l,r;} a[1001];ll cmp(node x,node y){
return x.r
>n>>d; for(int i=1; i<=n; i++) {
cin>>x>>y; x+=10000001;//将可能的负数变成正数 if(d
t) {
t=a[i].r; ans++;//得加一个雷达 } } cout<

转载地址:http://lhpwb.baihongyu.com/

你可能感兴趣的文章
国内外helm源记录
查看>>
牛客网题目1:最大数
查看>>
散落人间知识点记录one
查看>>
Leetcode C++ 随手刷 547.朋友圈
查看>>
手抄笔记:深入理解linux内核-1
查看>>
内存堆与栈
查看>>
Leetcode C++《每日一题》20200621 124.二叉树的最大路径和
查看>>
Leetcode C++《每日一题》20200622 面试题 16.18. 模式匹配
查看>>
Leetcode C++《每日一题》20200625 139. 单词拆分
查看>>
Leetcode C++《每日一题》20200626 338. 比特位计数
查看>>
Leetcode C++ 《拓扑排序-1》20200626 207.课程表
查看>>
Go语言学习Part1:包、变量和函数
查看>>
Go语言学习Part2:流程控制语句:for、if、else、switch 和 defer
查看>>
Go语言学习Part3:struct、slice和映射
查看>>
Go语言学习Part4-1:方法和接口
查看>>
Leetcode Go 《精选TOP面试题》20200628 69.x的平方根
查看>>
Leetcode C++ 剑指 Offer 09. 用两个栈实现队列
查看>>
Leetcode C++《每日一题》20200707 112. 路径总和
查看>>
云原生 第十一章 应用健康
查看>>
Leetcode C++ 《第202场周赛》
查看>>