POJ 1328 Radar Installation
2016-04-29 19:54
316 查看
Radar Installation
Time Limit:1000MS Memory Limit:10000KB 64bit
IO Format:%I64d & %I64u
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: 2Case 2: 1
思路:转化成区间问题,如果区间有相交叉的部分,说明有一个雷达就能覆盖,
如果,两区间不相交,说明一个雷达覆盖不了,只能再用一个雷达。这就成了
求区间上不相交的小区间个数了
#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; struct point { double left; //因为会出现小数所以定义为double型 double right; } a[1001]; bool cmp( const point x, const point y) { return x.right<y.right; } int main() { int n,d,t=1; while(scanf("%d%d",&n,&d)!=EOF) { if(n==0&&d==0) break; int i,count=0; double x,y,cur; int flag=1; for(i=0; i<n; i++) { scanf("%lf%lf",&x,&y); printf("%lf %lf\n",x,y); if(d-y<0) //如果小岛所在的纵坐标大于雷达所覆盖的范围 flag=0; //计为0 else if(flag) { a[i].left=x-sqrt(d*d-y*y); //计算雷达离某小岛的最远距离的左右坐标 a[i].right=x+sqrt(d*d-y*y); } } if(!flag) //如果为0,说明不能完全覆盖,输出 -1 { printf("Case %d: -1\n",t++); continue; } sort (a,a+n,cmp); //对右坐标从小到大排序 cur=a[0].right; for(i=1; i<n; i++) { if(cur<a[i].left) //如果左边的坐标(开始点)大于上一个区间的结束点坐标 { count++; cur=a[i].right; } } printf("Case %d:\n",t++); printf("%d\n",count); } return 0; }
相关文章推荐
- 1.一些 贪心算法 的简单思维题:
- 贪心算法——字典序最小问题
- 贪心算法——区间调度问题
- Jump Game I,II 贪心
- Wildcard Matching
- 贪心法实现无向图的划分 代码
- 贪心题目循环和控制台折行
- HDOJ 1009
- 【解题报告】【USACO】酸奶工厂
- 【解题报告】【】交谊舞
- POJ 1328
- Best Cow Line
- HDU 1009 Fatmouse's Trade
- POJ2377 Bad Cowtractors
- 贪心 hdu 1003
- 最大容器
- 满足和为定值的两个数或多个数
- Codeforces Round #300
- HUD1052 __ P2 1002 __ Tian Ji -- The Horse Racing
- 2015年国家集训队测试 BZOJ3816矩阵变幻