Radar
-
描述
-
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.
-
输入
-
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
输出
- 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. 样例输入
-
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
样例输出
-
Case 1: 2 Case 2: 1
来源
- Beijing 2002 上传者
思路:
贪心算法;
1. 把小岛看做圆心, 雷达的半径作为半径, 求这个圆与x轴的交点x, y; 那在x,y之间任意位置放置雷达都能覆盖小岛.既把小岛的坐标(xi,yi)转化成在x轴上的闭区间(x,y);
2. 然后对所有小岛根据x升序排序,因为下一步放置雷达是从最左边往右放的;
3. 令雷达的左端点x = 第一个小岛的y,然后不断向后覆盖其后小岛的左端点x,此时可能出现三种情况:
a。雷达右端点y>小岛的左端点x,即此雷达可以覆盖该小岛,则继续;
b。如果雷达的左端点x < 小岛的x坐标, 雷达肯定覆盖能此小岛,直接跳过。
c。如果雷达的右端点y < 小岛的左端点x, 雷达的计数器加1,开始新的一轮循环;
代码:
#include<stdio.h> #include<math.h> #include<algorithm> using namespace std; const int MAXN=1005; struct Line { double l,r; }line[MAXN];//每个岛作半径为d的圆,截得区间 bool cmp(Line a, Line b) { return a.r < b.r; } int main() { int n, d; int i, x, y; int num=1, flag, count; while(scanf("%d %d",&n, &d) && n && d){ flag = 1; for(i = 0; i < n; i ++){ scanf("%d %d",&x, &y); if(!flag) continue; if(y <= d){ line[i].l = (double)x - sqrt((double)d * d - y * y); line[i].r = (double)x + sqrt((double)d * d - y * y); } else flag = 0; } if(!flag){ printf("Case %d: -1\n",num++); continue; } sort(line, line+n, cmp); count = 1; double now = line[0].r; for(i = 1; i < n; i ++){ if(line[i].l <= now + 0.00005) continue; now = line[i].r; count ++; } printf("Case %d: %d\n", num++, count); } return 0; }
-
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.