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.
判断需要建造最少的雷达时,需要将远的
- #include <iostream>
- #include <algorithm>
- #include <stdlib.h>
- #include <math.h>
- using namespace std;
- struct point
- {
- double left, right;
- }p[2010], temp;
- bool operator < (point a, point b)
- {
- return a.left < b.left;
- }
- int main()
- {
- int n;
- double r;
- int kase = 0;
- while (cin >> n >> r && (n || r))
- {
- bool flag = false;
- for (int i = 0; i < n; i++)
- {
- double a, b;
- cin >> a >> b;
- if (fabs(b) > r)
- {
- flag = true;
- }
- else
- {
- p[i].left = a * 1.0 - sqrt(r * r - b * b);
- p[i].right = a * 1.0 + sqrt(r * r - b * b);
- }
- }
- cout << "Case " << ++kase << ": ";
- if (flag)
- {
- cout << -1 << endl;
- }
- else
- {
- int countt = 1;
- sort(p, p + n);
- temp = p[0];
- for (int i = 1; i < n; i++)
- {
- if (p[i].left > temp.right)
- {
- countt++;
- temp = p[i];
- }
- else if (p[i].right < temp.right)
- {
- temp = p[i];
- }
- }
- cout << countt << endl;
- }
- }
- }
至今不懂