您的位置:首页 > 其它

CSU - 1973

2017-08-01 17:20 232 查看

Radar Installation

Time limit : 1000 msMemory limit : 10000K

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.



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 2

1 2

-3 1

2 1

1 2

0 2

0 0

Sample Output

Case 1: 2

Case 2: 1

题目大意:

你需要在岸边给海上的岛屿建立雷达站。每个雷达站都有覆盖范围,给你n个岛屿的位置以及雷达站的覆盖范围,让你求出最少需要多少个雷达站。

解题思路:

1.采用贪心的方法,先求出每个岛屿在x轴上雷达站可覆盖的范围。(就是求出在Xstart~Xending,使得在这个范围内建造的雷达站能覆盖到这个岛屿)

2.对可行范围进行排序,ending越小的排在前面,对每一个ending都去找start在他前面的岛屿,这些岛屿都可以用同一个雷达站覆盖。直到下一个岛屿的start超过以后,再按照它的ending继续搜索。

3.题目本身不难,但是需要考虑很多边界情况与特殊情况:

岛屿的y值小于0 :跳过该岛屿的判断

岛屿的y值等于0 :需要判断,当作正常岛屿求解

岛屿的y值大于雷达范围/雷达范围小于等于0: 一定无解

4.经常WrongAnswer的可以看看下面附的一些测试数据

源代码:

#include<iostream>
#include<stdio.h>
#include<vector>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;

int n,len;
struct node{
int x,y;
};
struct area{
double start;
double ending;
bool operator <(const area &a) const {
return ending<a.ending || ending == a.ending && start<a.start;
}
};
node is[1005];
vector<area> ar;
bool flag = true;

int main(){
int Case=1;
while(scanf("%d%d",&n,&len)){
flag = true;
if(n==0 && len==0)
break;
ar.clear();
for(int i=0;i<n;i++){
scanf("%d%d",&is[i].x,&is[i].y);
if(is[i].y>len)
flag = false;
}
if(!flag || len<=0 ){
printf("Case %d: -1\n",Case++);
continue;
}
area a;
for(int i=0;i<n;i++){
if(is[i].y>=0){
double dx = sqrt((double)(len+is[i].y)*(len-is[i].y));
a.start = (double)is[i].x - dx;
a.ending = (double)is[i].x + dx;
ar.push_back(a);
}
}
if(ar.empty()){
printf("Case %d: -1\n",Case++);
continue;
}
int j = ar.size();
sort(ar.begin(),ar.end());
int ans=0,now=0,temp;
double next;
while(now<j){
ans++;
next = ar[now].ending;
temp = now+1;
while(temp<j && ar[temp].start<=next)
temp++;
now = temp;
}
printf("Case %d: %d\n",Case++,ans);
}
return 0;
}


input:

2 5

-3 4

-6 3

4 5

-5 3

-3 5

2 3

3 3

20 8

-20 7

-18 6

-5 8

-21 8

-15 7

-17 5

-1 5

-2 3

-9 6

1 2

2 3

3 4

4 5

5 6

6 7

7 8

8 7

9 6

10 5

0 0

2 3

0 2

2 3

2 3

0 2

1 3

3 3

1 2

-3 2

2 4

8 5

2 4

-4 4

-3 3

-3 1

-3 0

-1 0

0 5

6 0

3 0

1 2

-3 1

2 1

3 2

1 2

-3 1

2 1

1 2

0 2

2 3

0 2

2 3

4 -5

4 3

4 3

2 3

6 -9

3 -3

1 2

-3 2

2 1

6 2

1 2

1 2

1 2

-3 1

2 1

0 0

1 2

0 2

2 3

0 2

1 3

3 10

1 10

2 3

4 5

3 5

1 10

2 3

4 5

4 7

1 10

2 3

4 5

0 0

3 9

1 10

2 3

4 5

0 0

output:

Case 1: 1

4000

Case 2: 2

Case 3: 4

Case 4: 1

Case 5: 1

Case 6: -1

Case 7: 3

Case 8: -1

Case 9: 2

Case10: 1

Case 11: 1

Case 12: -1

Case 13: -1

Case 14: 2

Case 15: 1

Case 16: 1

Case 17: 1

Case 18: -1

Case 19: -1

Case 20: -1

数据链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 贪心策略