Radar Installation
Time Limit: 1000MS | Memory Limit: 10000K |
Total Submissions: 91342 | Accepted: 20438 |
Description
Assume thecoasting is an infinite straight line. Land is in one side of coasting, sea inthe other. Each small island is a point locating in the sea side. And any radarinstallation, locating on the coasting, can only cover d distance, so an islandin the sea can be covered by a radius installation, if the distance betweenthem is at most d.
We use Cartesian coordinate system, defining the coasting is the x-axis. Thesea side is above x-axis, and the land side below. Given the position of eachisland in the sea, and given the distance of the coverage of the radarinstallation, your task is to write a program to find the minimal number ofradar installations to cover all the islands. Note that the position of anisland is represented by its x-y coordinates.
Figure A Sample Input of Radar Installations
Input
The input consistsof 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 isthe distance of coverage of the radar installation. This is followed by n lineseach containing two integers representing the coordinate of the position ofeach 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 caseoutput one line consisting of the test case number followed by the minimalnumber of radar installations needed. "-1" installation means nosolution 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
想法:贪心
统计所有岛屿在在x轴上可放置的范围
class island {
public:
int x, y;
double l, r;
};
isl[i].l = isl[i].x*1.0 - sqrt(d*d - isl[i].y*isl[i].y);
isl[i].r = isl[i].x*1.0 + sqrt(d*d - isl[i].y*isl[i].y);
然后更加island.r的大小排序,先设置一个radar在island[0].r处,然后循环比较radar和island[i]更新
for (int i = 0; i<n; i++) {
if (isl[i].r == radar)
continue;
else if (isl[i].l > radar) {
radarNum++;
radar = isl[i].r;
}
}
完整代码:
//POJ 1328 Radar Installation
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define max 1000
using namespace std;
class island {
public:
int x, y;
double l, r;
};
bool cmp(island a, island b) {
if (a.r == b.r) return a.l<b.l;
return a.r<b.r;
}
int main(int argc, char const *argv[])
{
freopen("in.txt", "r", stdin);
int n, d, c = 1;
island isl[max];
while (cin >> n >> d &&(n||d)) {
int radarNum = 1;
bool flag = false;
for (int i = 0; i<n; i++) {
cin >> isl[i].x >> isl[i].y;
if (isl[i].y > d) { flag = true; continue; }
isl[i].l = isl[i].x*1.0 - sqrt(d*d - isl[i].y*isl[i].y);
isl[i].r = isl[i].x*1.0 + sqrt(d*d - isl[i].y*isl[i].y);
}
if (flag) { printf("Case %d: -1\n", c++); continue; }
sort(isl, isl + n, cmp);
double radar = isl[0].r;
for (int i = 0; i<n; i++) {
if (isl[i].r == radar)
continue;
else if (isl[i].l > radar) {
radarNum++;
radar = isl[i].r;
}
}
printf("Case %d: %d\n", c++, radarNum);
}
return 0;
}