Radar Installation
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 68597   Accepted: 15373

Description

Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d.

We use
Cartesian coordinate system, defining the coasting is the x-axis. The sea side
is above x-axis, and the land side below. Given the position of each island in
the sea, and given the distance of the coverage of the radar installation, your
task is to write a program to find the minimal number of radar installations to
cover all the islands. Note that the position of an island is represented by its
x-y coordinates.

Figure A Sample Input of Radar
Installations

Input

The input consists of several test cases. The first
line of each case contains two integers n (1<=n<=1000) and d, where n is
the number of islands in the sea and d is the distance of coverage of the radar
installation. This is followed by n lines each containing two integers
representing the coordinate of the position of each island. Then a blank line
follows to separate the cases.

The input is terminated by a line
containing pair of zeros

Output

For each test case output one line consisting of the
test case number followed by the minimal number of radar installations needed.
"-1" installation means no solution for that case.

Sample Input

3 2
1 2
-3 1
2 1 1 2
0 2 0 0

Sample Output

Case 1: 2
Case 2: 1 http://blog.csdn.net/zxiaopp/article/details/48845201

数轴上有n个闭区间[ai,bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。

贪心策略:

按照b1<=b2<=b3…(b相同时按a从大到小)的方式排序排序,从前向后遍历,当遇到没有加入集合的区间时,选取这个区间的右端点b。

证明:

为了方便起见,如果区间i内已经有一个点被取到,我们称区间i被满足。

1、首先考虑区间包含的情况,当小区间被满足时大区间一定被满足。所以我们应当优先选取小区间中的点,从而使大区间不用考虑。

按照上面的方式排序后,如果出现区间包含的情况,小区间一定在大区间前面。所以此情况下我们会优先选择小区间。

则此情况下,贪心策略是正确的。

不一定要按照正规解法,第一次我b相同,并不是按照a从大到小排序,而是a从小到大排序,其实怎么排序都可以,只要看最后的截止时间就ok了,如果下一个的开始时间在截止时间之前,那么可以用一个点覆盖,如果在后面,只需要两个点,然后更新到后面那个的截止时间,只要开始时间在截止前面一定不需要新的一个点来覆盖了。

 #include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAX = + ;
const double eps = 10e-;
struct Rader
{
double a,b;
};
Rader rader[MAX];
int cmp(Rader x, Rader y)
{
if(fabs(x.b - y.b) <= eps)
return x.a < y.a;
return (x.b - y.b) < -eps;
}
int main()
{
int n,d,flag,tase = ;
double x, y, t;
while(scanf("%d%d", &n, &d) != EOF)
{
if(n == && d == )
break;
flag = ;
for(int i = ; i <= n; i++)
{
scanf("%lf%lf", &x, &y);
if(d < y)
{
flag = ;
continue;
}
t = sqrt(d * d - y * y);
rader[i].a = x - t;
rader[i].b = x + t;
}
printf("Case %d: ",++tase);
if(flag)
{
printf("-1\n");
}
else
{
sort(rader + , rader + + n, cmp);
int cnt = ;
double start = rader[].b;
for(int i = ; i <= n; i++)
{
if(start - rader[i].a < -eps)
{
start = rader[i].b;
cnt++;
}
}
printf("%d\n", cnt);
} } return ;
}

b从小到大排序

之后又想了想可不可以针对a来排序,结果也是可以的,就对a从小到大咯,如果下一个的截止时间在这个截止时间之前不用新的点覆盖,但要更新到后一个的截止时间,对,因为要以小区间为基准;如果下一个的开始时间在截止时间之后那么一定得需要一个新的点来覆盖了,同时更新到后一个的截止时间

 #include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAX = + ;
const double eps = 10e-;
struct Rader
{
double a,b;
};
Rader rader[MAX];
int cmp(Rader x, Rader y)
{
// if(fabs(x.b - y.b) <= eps)
// return x.a < y.a;
return (x.a - y.a) < -eps;
}
int main()
{
int n,d,flag,tase = ;
double x, y, t;
while(scanf("%d%d", &n, &d) != EOF)
{
if(n == && d == )
break;
flag = ;
for(int i = ; i <= n; i++)
{
scanf("%lf%lf", &x, &y);
if(d < y)
{
flag = ;
continue;
}
t = sqrt(d * d - y * y);
rader[i].a = x - t;
rader[i].b = x + t;
}
printf("Case %d: ",++tase);
if(flag)
{
printf("-1\n");
}
else
{
sort(rader + , rader + + n, cmp);
int cnt = ;
double start = rader[].b;
for(int i = ; i <= n; i++)
{
if(start - rader[i].b > eps)
{
start = rader[i].b;
}
else if(start - rader[i].a < -eps)
{
start = rader[i].b;
cnt++;
}
}
printf("%d\n", cnt);
} } return ;
}

a从小到大

POJ1328Radar Installation(区间点覆盖问题)的更多相关文章

  1. UVAlive 2519 Radar Installation (区间选点问题)

    Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...

  2. poj1328Radar Installation 贪心

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64472   Accepted: 14 ...

  3. POJ1328Radar Installation

    http://poj.org/problem?id=1328 题的大意就是说在海里有小岛,坐标位置会给出,需要岸边的雷达覆盖所有的小岛,但雷达的覆盖范围有限,所以,需要最少的雷达覆盖所有的小岛,但若是 ...

  4. POJ1328Radar Installation(贪心)

    对于每一个点,可以找到他在x轴上的可行区域,这样的话就变为了对区间的贪心. #include<iostream> #include<stdio.h> #include<s ...

  5. Poj1328Radar Installation雷达安装

    原题链接 经典贪心,转化为问题为,对于所有的区间,求最小的点数能使每个区间都至少有一个点. #include<iostream> #include<cstdio> #inclu ...

  6. 【贪心】POJ1328-Radar Installation

    [思路] 以每一座岛屿为圆心,雷达范围为半径作圆,记录下与x轴的左右交点.如果与x轴没交点,则直接退出输出“-1”.以左交点为关键字进行排序,从左到右进行贪心.容易知道,离每一个雷达最远的那一座岛与雷 ...

  7. poj1328 Radar Installation 区间贪心

    题目大意: 在X轴选择尽量少的点作为圆心,作半径为d的圆.使得这些圆能覆盖所有的点. 思路: 把每个点都转化到X轴上.也就是可以覆盖这个点的圆心的位置的范围[a,b].然后按照每个点对应的a从小到大排 ...

  8. UVA 11134 FabledRooks 传说中的车 (问题分解)

    摘要:贪心,问题分解. 因为行列无关,所以这个二维问题可以分解成两个一维问题. 优先队列实现:类似区间点覆盖的问题,先按照左端点排序,相同然后在按右端点排序(灵活性小的优先选).最优的选法,当然是要使 ...

  9. poj 1328 Radar Installation【贪心区间选点】

    Radar Installation Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) ...

随机推荐

  1. 如何等到所有的图片都加载完成之后触发一次onload事件

    var details_img = $(".details img"); //所有的图片 var img_len = details_img.length; details_img ...

  2. 007医疗项目-模块一:用户的查找:3.用户表查询的Action和Service

    这里主要写Action和Service. 先写Service层: 架构如下:

  3. [2]Telerik Extensions for ASP.NET MVC 中文教程(2)

    上一篇文章对Telerik MVC Extensions作了一个大概的介绍,这篇文章将介绍如何将Telerik MVC Extensions添加到项目中.有以下两种方式可以将Telerik MVC E ...

  4. 【C#】【邮件】C#发送邮件出现 "指定字符串与主题所要求的形式不符"

    用C#发送邮件的时候有时会出现指定字符串与主题所要求的形式不符的问题. 经过查阅资料发现原因是主题里面你的字符串中有一些特殊字符导致出错.去掉改类字符即可成功. 比如: 我出现的错误原因是主题中有回车 ...

  5. Web API路由

    前言 本文描述了 ASP.NET Web API 如何将 HTTP 请求路由到控制器. 如果你熟悉Asp.Net MVC,Web API的路由与Asp.Net MVC的路由是非常类似的.这主要的区别就 ...

  6. Easyui Combotree问题及其相关

    Easyui的setValue方法无效 今天在开发项目的时候,遇到第一个很奇怪的问题:EasyUI的setValue方法无效. $('#department_parent').combotree('s ...

  7. iOS——特殊的几个控件

    29.UITextChecker您使用的UITextChecker类的实例来检查拼写错误的单词字符串(通常是文档中的文本).30.UITextPosition一个UITextPosition对象代表一 ...

  8. Javascript设计模式之我见:迭代器模式

    大家好!本文介绍迭代器模式及其在Javascript中的应用. 模式介绍 定义 提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 类图及说明 Iterator抽象迭代器 抽象迭代器负 ...

  9. HoloLens开发手记 - Unity之Keyboard input 键盘输入

    虽然HoloLens支持很多种输入方式,包括蓝牙键盘在内.但是大部分应用还是不能断定用户有物理键盘可以输入,所以虚拟键盘输入还是必须要提供的. Unity提供了一个TouchScreenKeyboar ...

  10. 使用OneNote的COM组件,实现OCR功能。

    背景 在业务系统开发的过程中,很多情况下会去识别图片中的相关信息,并且把信息录入到系统中.现在希望通过自动化的方式录入,就有了以下的工作.在对比了几个OCR软件在中文识别方面的准确率后,决定使用微软的 ...