poj 1328 Radar Installation

来源:互联网 发布:必读书 知乎 编辑:程序博客网 时间:2024/06/06 03:41

http://poj.org/problem?id=1328



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 21 2-3 12 11 20 20 0
Sample Output
Case 1: 2Case 2: 1

题目大意:

在一个平面坐标系中,上部分是海,海上有岛屿,现在要在x轴上放雷达监测这些岛屿,问最少放多少个;

思路:

每个雷达监测半径是d,当岛屿的y坐标大于d时,输出-1;以岛屿为圆心d为半径做圆与x轴交于两点,如果岛屿之间在x轴的交点有重复的地方,那么这几个岛屿用一个雷达就可以监测到。



#include<stdio.h>#include<algorithm>#include<math.h>using namespace std;struct island{float left;float right;};int cmp(island x,island y){if(x.left==y.left)return x.right<y.right;return x.left<y.left;}int main(){int i,j,n,d,flag,x,y,radar,Case=1;float t;island a[1005];while(scanf("%d%d",&n,&d)&&(n!=0||d!=0)){radar=1;flag=1;for(i=0;i<n;i++){scanf("%d%d",&x,&y);if(y>d){flag=0;continue;}a[i].left=x-sqrt(d*d-y*y);a[i].right=x+sqrt(d*d-y*y);}if (!flag)            printf ("Case %d: -1\n",Case++);        else{        sort(a,a+n,cmp);        t=a[0].right;        for(i=1;i<n;i++){//找有没有重叠的部分        if(a[i].left<=t){//有        if(a[i].right<t)//再比较右端点,找区间更小的        t=a[i].right;}        else{//没有,雷达+1        t=a[i].right;        radar++;}}printf ("Case %d: %d\n",Case++,radar);}}return 0;}




原创粉丝点击