博客园 首页 私信博主 显示目录 隐藏目录 管理

Radar Installation---(贪心)

Radar Installation
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 115873   Accepted: 25574

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.

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 2
1 2
-3 1
2 1

1 2
0 2

0 0

Sample Output

Case 1: 2
Case 2: 1

Source

分析:首先根据小岛的坐标计算出每座小岛对应海岸线上的范围。将每个小岛对应在海岸线上的范围进行排序,使得每个雷达范围的最小值进行递增。
对雷达范围进行贪心。。。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 const int maxn=1010;
 8 #define INf 0x3f3f3f3f
 9 struct node{
10     double l,r;
11 }point[maxn];
12 
13 bool cmp(const node &a,const node &b){
14     return a.l<b.l;
15 }
16 
17 int main(){
18     int n,d;
19     int case1=0;
20     while(~scanf("%d%d",&n,&d)&&n){
21         int flag=0;
22         for(int i=0; i<n; i++ ){
23             int x,y;
24             cin>>x>>y;
25             if(y>d){
26                 flag=1;
27 //                break;
28             }
29             double p=sqrt((double)(d*d)-y*y);
30             point[i].l=x-p;
31             point[i].r=x+p;
32         }
33         printf("Case %d: ",++case1);
34         if(flag){
35             cout<<-1<<endl;
36             continue;
37         }
38         sort(point,point+n,cmp);
39         int ans=1;
40         node tmp=point[0];
41         for( int i=1; i<n; i++ ){
42             if(tmp.r>=point[i].r) tmp=point[i];
43             else if(tmp.r<point[i].l){
44                 ans++;
45                 tmp=point[i];
46             }
47         }
48         cout<<ans<<endl;
49     }
50     return 0;
51 }

 

posted @ 2019-03-15 19:19  Brave_WTZ  阅读(125)  评论(0编辑  收藏  举报