Poj 1328 Radar Installation [greedy] [range selection problem], pojradar
Radar Installation
Time Limit:1000 MS |
|
Memory Limit:10000 K |
Total Submissions:54798 |
|
Accepted:12352 |
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 abve 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 21 2-3 12 11 20 20 0
Sample Output
Case 1: 2Case 2: 1
It is to find the least station to cover all vertices.
Idea: we can use a vertex as the circle with a radius of d and the X axis as the intersection. If there is no intersection, it is definitely not a task, and vice versa, it is converted into a range selection problem.
Code:
#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>using namespace std;#define M 1005struct node {double st, en;}s[M];int cmp(node a, node b){if(a.en == b.en) return a.st > b.st;return a.en<b.en;}int main(){int n, v = 1; double d;while(scanf("%d%lf", &n, &d), n||d){int i, j;double a, b;int flag = 0;for(i = 0; i < n; i ++){scanf("%lf%lf", &a, &b);if(b>d) flag = 1;if(flag == 0){s[i].en = a+sqrt(d*d-b*b);s[i].st = a-sqrt(d*d-b*b);//printf("%lf %lf %d..\n", s[i].st, s[i].en, i);}//scanf("%lf%lf", &s[i].st, &s[i].en);}printf("Case %d: ", v++);if(flag){printf("-1\n"); continue;}sort(s, s+n, cmp);int ans = 1;double maxr = s[0].en;i = 1, j = 0;while(i < n){if(s[i].st <= s[j].en){//if(maxr < s[i].en) maxr = s[i].en;++i;}else {//if(j == i-1) j = i;++ans;//maxr = s[i].en;}}printf("%d\n", ans);}return 0;}