coder_new

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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
注意变量的初始化位置,最好在使用前初始化,如果出现错误,很难查找。
注意cmp函数的使用
View Code
 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4  
 5  typedef struct
 6  {
 7      double l;
 8      double r;
 9  }Area;
10  Area area[1000];
11 
12  int cmp(const void *a,const void *b)
13  {
14      Area *A_a=(Area *)a;
15      Area *A_b=(Area *)b;
16      return (*A_a).l>(*A_b).l?1:-1;
17  }
18 
19  int main()
20  {
21      int n,d,x,y,flag,case_num,num=1;
22      while(cin>>n>>d&&!(n==0&&d==0))
23      {
24          flag=0;
25 
26          for(int i=0;i<n;i++)
27          {
28              cin>>x;
29              cin>>y;
30              if(y<=d&&flag==0)
31              {
32                  area[i].l=x-sqrt(double(d*d-y*y));
33                  area[i].r=x+sqrt(double(d*d-y*y));
34              }
35              else flag=1;
36          }
37 
38          if(flag==1) 
39          {
40              cout<<"Case "<<num<<": "<<-1<<endl;
41              num++;
42              continue;
43          }
44          qsort(area,n,sizeof area[0],cmp);
45 
46          double right=area[0].r;
47          case_num=1;
48 
49          for(int i=1;i<n;i++)
50          {
51              if(area[i].l>right)
52              {
53                  case_num++;
54                  right=area[i].r;
55              }
56              else if(area[i].r<right) right=area[i].r;
57          }
58 
59          cout<<"Case "<<num<<": "<<case_num<<endl;
60          num++;
61      }
62      return 0;
63  }

 

posted on 2012-05-08 17:56  coder_new  阅读(279)  评论(0编辑  收藏  举报