POJ1328Radar Installation(区间点覆盖问题)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 68597 | Accepted: 15373 |
Description
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
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
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(区间点覆盖问题)的更多相关文章
- UVAlive 2519 Radar Installation (区间选点问题)
Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...
- poj1328Radar Installation 贪心
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64472 Accepted: 14 ...
- POJ1328Radar Installation
http://poj.org/problem?id=1328 题的大意就是说在海里有小岛,坐标位置会给出,需要岸边的雷达覆盖所有的小岛,但雷达的覆盖范围有限,所以,需要最少的雷达覆盖所有的小岛,但若是 ...
- POJ1328Radar Installation(贪心)
对于每一个点,可以找到他在x轴上的可行区域,这样的话就变为了对区间的贪心. #include<iostream> #include<stdio.h> #include<s ...
- Poj1328Radar Installation雷达安装
原题链接 经典贪心,转化为问题为,对于所有的区间,求最小的点数能使每个区间都至少有一个点. #include<iostream> #include<cstdio> #inclu ...
- 【贪心】POJ1328-Radar Installation
[思路] 以每一座岛屿为圆心,雷达范围为半径作圆,记录下与x轴的左右交点.如果与x轴没交点,则直接退出输出“-1”.以左交点为关键字进行排序,从左到右进行贪心.容易知道,离每一个雷达最远的那一座岛与雷 ...
- poj1328 Radar Installation 区间贪心
题目大意: 在X轴选择尽量少的点作为圆心,作半径为d的圆.使得这些圆能覆盖所有的点. 思路: 把每个点都转化到X轴上.也就是可以覆盖这个点的圆心的位置的范围[a,b].然后按照每个点对应的a从小到大排 ...
- UVA 11134 FabledRooks 传说中的车 (问题分解)
摘要:贪心,问题分解. 因为行列无关,所以这个二维问题可以分解成两个一维问题. 优先队列实现:类似区间点覆盖的问题,先按照左端点排序,相同然后在按右端点排序(灵活性小的优先选).最优的选法,当然是要使 ...
- poj 1328 Radar Installation【贪心区间选点】
Radar Installation Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) ...
随机推荐
- git config配置文件
设置 git status的颜色. git config --global color.status auto 一.Git已经在你的系统中了,你会做一些事情来客户化你的Git环境.你只需要做这些设置一 ...
- nginx log的json格式:
nginx log的json格式: 为了elk便于统计: yum安装nginx: log_format json '{"@timestamp": "$time_iso86 ...
- mysql-advanced-5.6.23-linux-glibc2.5-x86_64安装
0,二进制安装: mysql-advanced-5.6.23-linux-glibc2.5-x86_64.zip 1,软件包 mysql-advanced-5.6.23-linux-glibc2. ...
- 学习心得:《十个利用矩阵乘法解决的经典题目》from Matrix67
本文来自:http://www.matrix67.com/blog/archives/tag/poj大牛的博文学习学习 节选如下部分:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律:二,矩阵乘法满足 ...
- Linux 进程与线程二(等待--分离--取消线程)
int pthread_join(pthread_t thr,void **thr_return); pthread_join函数用于挂起当前线程,直至th指定的线程终止为止. 如果另一个线程返回值不 ...
- 解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法
1.开启Ad Hoc Distributed Queries组件,在sql查询编辑器中执行如下语句: reconfigure reconfigure 2.关闭Ad Hoc Distributed Qu ...
- text/html与text/plain有什么区别?
MIME是服务器通知客户机传送文件是什么类型的主要方法,客户机浏览器也通过MIME告诉服务器它的参数. 在网上,如果接收到的文件没有MIME头,就默认它为HTML格式.但这样也不好,因为当MIME的包 ...
- pandas 时间序列resample
resample与groupby的区别:resample:在给定的时间单位内重取样groupby:对给定的数据条目进行统计 函数原型:DataFrame.resample(rule, how=None ...
- 分页-pagination
需先引入jQuery,再引入pagination组件 <script src="jquery.js"></script> <script src=&q ...
- Bootstrap系列 -- 28. 下拉菜单状态
下拉菜单项的默认的状态(不用设置)有悬浮状态(:hover)和焦点状态(:focus). 下拉菜单项除了上面两种状态,还有当前状态(.active)和禁用状态(.disabled).这两种状态使用方法 ...