POJ 1328 Radar Installation(贪心)
Posted ventricle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1328 Radar Installation(贪心)相关的知识,希望对你有一定的参考价值。
题目网址:http://poj.org/problem?id=1328
题目:
Radar Installation
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 88789 | Accepted: 19915 |
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.
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轴的距离超过d时,必定不能覆盖输出-1。否则,以海岛为圆心,雷达覆盖范围为半径做圆,得到圆与x轴的交点。分别记录n个海岛的左交点和右交点。
将区间按照右交点升序排序,遍历区间,找到不能包含当前区间的右交点的区间,雷达数加一。(贪心算法)
代码:
1 #include <cstdio> 2 #include <vector> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 struct node{ 7 double l,r; 8 }; 9 vector<node>v,vt; 10 int n,d; 11 int flag; 12 int ind=0; 13 bool cmp(node x,node y){ 14 return x.r<y.r;//注意是按照右交点排序 15 } 16 int main(){ 17 int x,y; 18 while (scanf("%d%d",&n,&d)!=EOF && (n!=0 || d!=0)) { 19 int res=0; 20 printf("Case %d: ",++ind); 21 v.clear(); 22 flag=0; 23 for (int i=0; i<n; i++) { 24 scanf("%d%d",&x,&y); 25 if(fabs(y)>d) flag=1; 26 node t; 27 t.l=x-sqrt(d*d-y*y);//左交点 28 t.r=x+sqrt(d*d-y*y);//右交点 29 v.push_back(t); 30 31 } 32 if(flag){ 33 printf("-1\\n"); 34 continue; 35 } 36 sort(v.begin(), v.end(), cmp); 37 int j=0; 38 while(j<v.size()){ 39 double r=v[j].r; 40 int t=j; 41 while(v[j+1].l<=r && v[j+1].r>=r ) j++;//找到一个区间不包含外层区间的右交点 42 j++; 43 res++; 44 } 45 printf("%d\\n",res); 46 } 47 return 0; 48 }
以上是关于POJ 1328 Radar Installation(贪心)的主要内容,如果未能解决你的问题,请参考以下文章