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
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
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
The input is terminated by a line containing pair of zeros
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 0Sample Output
Case 1: 2 Case 2: 1
题解:
直接考虑这个题目可能无从下手。
我们把模型抽象出来,就是从选取若干从以x轴为圆心,d为半径的圆,覆盖所有的所给的点,求最小的圆数。
这个模型无法下手,考虑转化模型,因为只能在x轴上,所以考虑对于每个点,求出,在x轴上所对应的可以覆盖这个点的区间段,那么问题就变成了对于每个区间,求最小点数可以覆盖所有的区间。经典贪心问题,剩下的就没什么了。
代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <iostream> #define MAXN 10000 using namespace std; struct qvjian{ double l,r; }a[MAXN]; int n;double d; bool cmp(qvjian x,qvjian y){ return x.r<y.r; } int main() { int Case=0,flag=0; while(1){ //memset(a,0,sizeof(a)); cin>>n>>d;flag=0; if(!n&&!d) break; if(d<0) flag=1; for(int i=1;i<=n;i++){ double x,y; scanf("%lf%lf",&x,&y); if(d*d-y*y<0){ flag=1; } double l=x-sqrt(d*d-y*y),r=x+sqrt(d*d-y*y); a[i].l=l,a[i].r=r; } if(flag){ printf("Case %d: -1 ",++Case); continue; } sort(a+1,a+n+1,cmp); int ans=0;double now=-(1<<30); for(int i=1;i<=n;i++){ if(now<a[i].l){ now=a[i].r; ans++; } } printf("Case %d: %d ",++Case,ans); } return 0; }