POJ - 1328 Radar Installation(贪心+思维)
题目链接:点击查看
题目大意:校长想通过监控设备覆盖学校内的N座建筑物,每座建筑物被视作一个质点,在笛卡尔坐标系中给出他们的坐标(x,y),并且所有建筑物均处在x轴的上方。因为学校的供电和传输线路均沿x轴,所以监控设备只被允许建立在x轴上,每台监控设备的监控范围均为一个半径为R的圆形,圆心即为这台设备。现在给出N座建筑物的坐标,问:最少需要几台这样的设备可以实现对所有建筑物的监控?
题目分析:对于这个题目而言,直接操作的话肯定是相当困难的,我们不妨将其转换一下,因为每个监控设备的监控范围已知,所以我们以每个建筑物为圆心,半径为R画圆,与x轴的两个交点记为区间[l,r],这样就将问题转换为了:若想将所有的建筑物都监控到位,每个区间内至少需要出现一个监控设备
这样我们就成功转换成一个区间问题了,因为是要求最少数量,所以要设计贪心策略,对于区间问题肯定离不开排序,而这个题目的区间顺序对答案没有影响,我们不妨先将其按照左端点升序排序,然后依次遍历每一个区间,设pos为最后一个监控设备所在的位置,我们分情况讨论一下:
- 若当前区间的左端点位于pos的左边,因为我们是按照区间左端点升序排序的,所以当前区间的左端点一定在上一个区间的左端点与pos之间,而上一个区间的左端点到pos之间的整个范围内都已经被pos位置的监控设备监控着,所以当前区间代表的建筑物可以被pos位置的监控设备监控着,并且实时将pos位置改为pos和当前位置右端点中的较小值,因为只有当pos在当前区间内才能监视到当前区间内(废话)
- 若当前区间的左端点位于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(贪心+思维)相关推荐
- POJ 1328 Radar Installation【贪心】
POJ 1328 题意: 将一条海岸线看成X轴,X轴上面是大海,海上有若干岛屿,给出雷达的覆盖半径和岛屿的位置,要求在海岸线上建雷达,在雷达能够覆盖全部岛屿情况下,求雷达的最少使用量. 分析: 贪心法 ...
- poj 1328 Radar Installation
题目链接:http://poj.org/problem?id=1328 题意: 设x轴为海岸,下方为陆地,上方为海.海上有n个岛屿,现在需要用雷达将所有的岛屿覆盖起来.给定岛屿个数及每个岛屿的坐标,给 ...
- POJ-1328 Radar Installation 贪心
以每个点算出左右覆盖的雷达所在x轴范围,然后贪心计算出所需圆的个数. 当后一个点的圆心在x轴的左坐标在前一个点的右坐标的右坐标之前,则这个点就会被覆盖. 代码如下:(C++能过,G++ runtime ...
- 【贪心】Radar Installation(poj 1328)
Radar Installation poj 1328 题目大意: 在平面直角坐标系的一二象限上有n个小岛,现在让你在x坐标上布置雷达,每个雷达可以侦测以它为原心,半径为m的圆内的所有小岛,现在问侦测 ...
- 【POJ - 1328】Radar Installation(贪心+计算几何)安装雷达辐射岛屿
题干: Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the ot ...
- POJ Radar Installation 1328(雷达)贪心算法
问题描述 问题链接 Description Assume the coasting is an infinite straight line. Land is in one side of coast ...
- 贪心算法—建立雷达(POJ 1328)
贪心算法--区间选点问题 这也是贪心算法的经典问题,一般情况为:有n个闭区间[ai,bj],取尽量少的点,使得每个区间内都至少有一个点. 分析 如果区间i内已经有一个点被取到,则称此区间已经被满足. ...
- 贪心/思维题 UVA 11292 The Dragon of Loowater
题目传送门 1 /* 2 题意:n个头,m个士兵,问能否砍掉n个头 3 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 4 */ 5 #include <cstdio> 6 #i ...
- 1450F The Struggling Contestant(贪心+思维)
1450F The Struggling Contestant(贪心+思维) Codeforces Global Round 12 F. The Struggling Contestant 题面:Th ...
最新文章
- html的悬浮框 贼简单 记录一下
- Java虚拟机:对象创建过程与类加载机制、双亲委派模型
- 在Spring Boot中使用 @ConfigurationProperties 注解
- php 写 mysql 事件_PHP日歷,包含來自MySQL數據庫的重復事件
- bat 脚本清空窗口内容_tomcat9.0启动脚本startup.bat的分析
- oracle 5表关联查询,Oracle学习笔记5 - 表查询
- 四脚轻触开关pcb封装_轻触开关的规格尺寸与型号选择
- 鸟叫就能黑掉AI系统,而且你根本察觉不到
- 【Python-2.7】多种方式删除列表元素
- 信息收集--空间搜索引擎/网盘
- 前端面试题(带答案)
- 小公司程序员怎么进大公司
- 酷我音乐盒在听一遍就自己默认下载…
- tomcat记录访问日志
- Henry的VB.NET之旅(十)—何时用接口
- 第六章(1.4)自然语言处理实战——时间语义抽取
- 总结matlab2018a安装后遇到matlab license manager error -8
- 自动开料机器人_木工机器人自动化加工生产线
- MyEclipse 6.5 下载及注册
- python 计算最短路径算法