题目链接:点击查看

题目大意:校长想通过监控设备覆盖学校内的N座建筑物,每座建筑物被视作一个质点,在笛卡尔坐标系中给出他们的坐标(x,y),并且所有建筑物均处在x轴的上方。因为学校的供电和传输线路均沿x轴,所以监控设备只被允许建立在x轴上,每台监控设备的监控范围均为一个半径为R的圆形,圆心即为这台设备。现在给出N座建筑物的坐标,问:最少需要几台这样的设备可以实现对所有建筑物的监控?

题目分析:对于这个题目而言,直接操作的话肯定是相当困难的,我们不妨将其转换一下,因为每个监控设备的监控范围已知,所以我们以每个建筑物为圆心,半径为R画圆,与x轴的两个交点记为区间[l,r],这样就将问题转换为了:若想将所有的建筑物都监控到位,每个区间内至少需要出现一个监控设备

这样我们就成功转换成一个区间问题了,因为是要求最少数量,所以要设计贪心策略,对于区间问题肯定离不开排序,而这个题目的区间顺序对答案没有影响,我们不妨先将其按照左端点升序排序,然后依次遍历每一个区间,设pos为最后一个监控设备所在的位置,我们分情况讨论一下:

  1. 若当前区间的左端点位于pos的左边,因为我们是按照区间左端点升序排序的,所以当前区间的左端点一定在上一个区间的左端点与pos之间,而上一个区间的左端点到pos之间的整个范围内都已经被pos位置的监控设备监控着,所以当前区间代表的建筑物可以被pos位置的监控设备监控着,并且实时将pos位置改为pos和当前位置右端点中的较小值,因为只有当pos在当前区间内才能监视到当前区间内(废话)
  2. 若当前区间的左端点位于pos的右边,那么pos位置的监控设备肯定不可能出现在当前区间内了,所以我们就直接再新建一个监控设备在当前区间的右端点处就行了

按照上述贪心策略实现就好了:

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;struct Node
{double l,r;bool operator<(const Node& a)const{return l<a.l;}
}a[N];int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n,r,kase=0;while(scanf("%d%d",&n,&r)!=EOF&&n+r){bool flag=false;for(int i=1;i<=n;i++){int x,y;scanf("%d%d",&x,&y);if(y>r)//特判-1 flag=true;a[i].l=1.0*x-sqrt(1.0*r*r-y*y);a[i].r=1.0*x+sqrt(1.0*r*r-y*y);}if(flag){printf("Case %d: %d\n",++kase,-1);continue;}sort(a+1,a+1+n);int ans=0;double pos=-1e10;//初始化pos为负无穷for(int i=1;i<=n;i++){if(a[i].l>pos){pos=a[i].r;ans++;}else{pos=min(pos,a[i].r);}}printf("Case %d: %d\n",++kase,ans);}return 0;
}

POJ - 1328 Radar Installation(贪心+思维)相关推荐

  1. POJ 1328 Radar Installation【贪心】

    POJ 1328 题意: 将一条海岸线看成X轴,X轴上面是大海,海上有若干岛屿,给出雷达的覆盖半径和岛屿的位置,要求在海岸线上建雷达,在雷达能够覆盖全部岛屿情况下,求雷达的最少使用量. 分析: 贪心法 ...

  2. poj 1328 Radar Installation

    题目链接:http://poj.org/problem?id=1328 题意: 设x轴为海岸,下方为陆地,上方为海.海上有n个岛屿,现在需要用雷达将所有的岛屿覆盖起来.给定岛屿个数及每个岛屿的坐标,给 ...

  3. POJ-1328 Radar Installation 贪心

    以每个点算出左右覆盖的雷达所在x轴范围,然后贪心计算出所需圆的个数. 当后一个点的圆心在x轴的左坐标在前一个点的右坐标的右坐标之前,则这个点就会被覆盖. 代码如下:(C++能过,G++ runtime ...

  4. 【贪心】Radar Installation(poj 1328)

    Radar Installation poj 1328 题目大意: 在平面直角坐标系的一二象限上有n个小岛,现在让你在x坐标上布置雷达,每个雷达可以侦测以它为原心,半径为m的圆内的所有小岛,现在问侦测 ...

  5. 【POJ - 1328】Radar Installation(贪心+计算几何)安装雷达辐射岛屿

    题干: Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the ot ...

  6. POJ Radar Installation 1328(雷达)贪心算法

    问题描述 问题链接 Description Assume the coasting is an infinite straight line. Land is in one side of coast ...

  7. 贪心算法—建立雷达(POJ 1328)

    贪心算法--区间选点问题 这也是贪心算法的经典问题,一般情况为:有n个闭区间[ai,bj],取尽量少的点,使得每个区间内都至少有一个点. 分析 如果区间i内已经有一个点被取到,则称此区间已经被满足. ...

  8. 贪心/思维题 UVA 11292 The Dragon of Loowater

    题目传送门 1 /* 2 题意:n个头,m个士兵,问能否砍掉n个头 3 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 4 */ 5 #include <cstdio> 6 #i ...

  9. 1450F The Struggling Contestant(贪心+思维)

    1450F The Struggling Contestant(贪心+思维) Codeforces Global Round 12 F. The Struggling Contestant 题面:Th ...

最新文章

  1. html的悬浮框 贼简单 记录一下
  2. Java虚拟机:对象创建过程与类加载机制、双亲委派模型
  3. 在Spring Boot中使用 @ConfigurationProperties 注解
  4. php 写 mysql 事件_PHP日歷,包含來自MySQL數據庫的重復事件
  5. bat 脚本清空窗口内容_tomcat9.0启动脚本startup.bat的分析
  6. oracle 5表关联查询,Oracle学习笔记5 - 表查询
  7. 四脚轻触开关pcb封装_轻触开关的规格尺寸与型号选择
  8. 鸟叫就能黑掉AI系统,而且你根本察觉不到
  9. 【Python-2.7】多种方式删除列表元素
  10. 信息收集--空间搜索引擎/网盘
  11. 前端面试题(带答案)
  12. 小公司程序员怎么进大公司
  13. 酷我音乐盒在听一遍就自己默认下载…
  14. tomcat记录访问日志
  15. Henry的VB.NET之旅(十)—何时用接口
  16. 第六章(1.4)自然语言处理实战——时间语义抽取
  17. 总结matlab2018a安装后遇到matlab license manager error -8
  18. 自动开料机器人_木工机器人自动化加工生产线
  19. MyEclipse 6.5 下载及注册
  20. python 计算最短路径算法

热门文章

  1. 大规模服务化对于服务治理的要求
  2. 释放锁以及添加线程对于队列的变化
  3. AOP 代理(AOP Proxy)
  4. 注解能力ApplicationContext作为 IoC 容器示例
  5. 微信支付 - 支付中心回调通知
  6. 定义和使用含有泛型的类
  7. flume案例-网络数据采集-Flume的配置
  8. spring基于注解的声明式事务控制
  9. 两个引用指向同一个数组的内存图
  10. 关于idea右侧的maven project 如何调出来