题目链接:http://poj.org/problem?id=1328
Radar Installation
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 67443 | Accepted: 15121 |
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
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
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
Source
题意: 输入n,d,表示有n个点,半径为d,接下来输入n行,表示n个点的坐标,最少需要几个才能将所有点包围。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; struct node { double x,y; } a[1005]; struct len { double l, r; } ans[1005]; bool cmp(len x1, len x2) { if(fabs(x1.l-x2.l)<1e-10) return x1.r < x2.r; return x1.l < x2.l; } int main() { int n; double d; int k=1; while(scanf("%d%lf",&n, &d),n+d) { int flag = 0; for(int i=0; i<n; i++) { scanf("%lf%lf",&a[i].x,&a[i].y); if(a[i].y-d > 1e-10) { flag = 1; } } int s = 1; if(flag) s=-1; else { for(int i=0; i<n; i++) { double l = sqrt(pow(d,2) - pow(a[i].y,2)); ans[i].l = a[i].x - l; ans[i].r = a[i].x + l; } sort(ans, ans+n, cmp); double R = ans[0].r; for(int i=1; i<n; i++) { if(ans[i].l-R > 1e-10) { s++; R = ans[i].r; } else { R = min(R, ans[i].r); } } } printf("Case %d: %d ",k++,s); } return 0; }