Radar Installation
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 87316 | Accepted: 19570 |
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
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.
![](https://i-blog.csdnimg.cn/blog_migrate/f6ffe515205096387436c13c7449b0ed.jpeg)
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
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
题目大意:
雷达搜索小岛,雷达只能在x坐标轴上运动,有个检测范围,小岛只能在x轴上方,请问给出雷达测量距离和小岛坐标,怎么样才能是的雷达的数量最少就能让小岛全部被搜索到
题意理解容易,可怎么贪心?
仔细想想从x负坐标轴往右搜索小岛,以小岛所在位置为圆心,以雷达测量距离为半径做一个圆叫x轴于两个点或者一个点(如若不交的话直接-1输出)这样第一个小岛就划出一个区间,那么只要雷达一直在这个区间中就一定能搜索到这个小岛,求出第一个小岛的雷达区间,求出第二个小岛的区间,两个区间所交到的区间为一个新区间,往后遍历第三个小岛,求出他的区间,然后在用它和这个新区间求交集,在作为新区间,不断缩小这个新区间,只要往后的小岛的区间和这个区间有交集,就说明可以用同一个雷达搜索到这些小岛。当某一个区间和这个始终更新的新区间没有交集是说明要换一个雷达重新搜索,
ac代码:
#include<iostream> #include<math.h> #include<algorithm> using namespace std; struct Coor{ double x,y; }; bool cmp(Coor q,Coor p) { return q.x<p.x; } int main() { int n,d,cont=0; Coor island[1005],coor[1005]; while(cin>>n>>d&&n&&d) { int i,j,k=0,count=0,flag=1; cont++; for(i=0;i<n;i++) { cin>>island[i].x>>island[i].y; if(island[i].y>d) flag=0; coor[i].x=island[i].x-pow(pow(d,2)-pow(island[i].y,2),1.0/2); coor[i].y=island[i].x+pow(pow(d,2)-pow(island[i].y,2),1.0/2); } if(!flag) { cout<<"Case "<<cont<<": "<<"-1"<<endl; continue; } sort(coor,coor+n,cmp); for(i=0;i<n;i++) { double _min=coor[i].y; for(j=i+1;j<n;j++) { _min=min(_min,coor[j].y); if(coor[j].x<=_min) count++; else break; } i=i+count; count=0; k++; } cout<<"Case "<<cont<<": "<<k<<endl; } return 0;}