POJ 1328 Radar Installation

来源:互联网 发布:mac怎么玩魔兽 编辑:程序博客网 时间:2024/05/20 07:17

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 1000using 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;}