题目链接:

http://poj.org/problem?id=1328

题意:

在x轴上有若干雷达,可以覆盖距离d以内的岛屿。

给定岛屿坐标,问至少需要多少个雷达才能将岛屿全部包含。

分析:

对于每个岛屿,计算出可以包含他的雷达所在的区间,找到能包含最多岛屿的区间即可。

可以看出这是一个典型的区间问题,我们有几种备选方法:

(1)优先选取右端点最大的区间。

(2)优先选取长度最长的区间。

(3)优先选取与其他区间重叠最少的区间。

2.3很容易想到反例,而1则是正确的,端点越靠右,剩下的区间就越少,需要的雷达就越少。

代码:

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1005, INF = 0x3f3f3f3f;
struct node
{
double x, y;
bool operator <(const node &a)const{
return y > a.y;
}
};
node p[maxn];
int main (void)
{
int n, d;
int Case = 1;
while(scanf("%d%d", &n, &d) && (n != 0 ||d != 0)){
int x, y;
int maxy = -INF;
for(int i = 0; i < n; i++) {
scanf("%d%d", &x, &y);
maxy = max(maxy, y);
double dis = sqrt(1.0 * d * d - 1.0 * y * y);
p[i].x = 1.0 * x - dis;
p[i].y = 1.0 * x + dis;
}
if(maxy > d || d < 0) {
printf("Case %d: -1\n", Case++);
continue;
}
sort(p, p + n);
int cnt = 1;
double t = -INF;
for(int i = 0; i < n; i++){
if(t > p[i].y ) {
cnt++;
t = p[i].x;
}
else t = max(p[i].x, t);
}
printf("Case %d: %d\n", Case++, cnt);
}
}

最新文章

  1. 【.NET深呼吸】存储基于本地线程的值
  2. Libgdx 循环绘制图片时间隔的问题
  3. JS正则表达式大全
  4. 基于事件的异步模式(EAP)
  5. @RequestMapping用法详解
  6. 完成端口(Completion Port)详解(转)
  7. java创建Date日期时间笔记
  8. HTML5与CSS3权威指南.pdf8
  9. 系统调用和中断处理的异同(以Linux MIPS为例)
  10. 为什么php时间阅读RTF,p标签会出现红色
  11. [转]Pig与Hive 概念性区别
  12. 微信小程序对医疗创业的启示,“餐饮+微信小程序”的猜想
  13. jmeter- Java-POST接口使用get与json格式传参
  14. SQL 分组统计 行转列 CASE WHEN 的使用
  15. Linux下VMware在更新完内核无法启动
  16. powershell 定时删除脚本
  17. 喵哈哈村的魔法考试 Round #19 (Div.2) 题解
  18. HDU 2088 Box of Bricks
  19. [Git] Squash all of my commits into a single one and merge into master
  20. GDB调试&mdash;&mdash;常用的命令

热门文章

  1. Android手机app耗电量测试工具 - Gsam Battery Monitor
  2. 在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图
  3. C# 递归读取XML菜单数据
  4. (转)配置Spring管理的bean的作用域
  5. Python 使用re模块实现正则表达式
  6. IOS学习笔记37——ViewController生命周期详解
  7. avalon转成Vue
  8. Shell转大写为小写
  9. POJ-1190-生日蛋糕(深搜,剪枝)
  10. consul无client模式