贪心。
一开始的思路:
图中ABCD为海岛的位置。假设本题半径为2(符合坐标系),那么A点坐标为(1,1)以此类推。
在题中,记录每个点的坐标,并把一个点新加一个标记变量以标记是否被访问过。
首先以A为圆心,r为半径做圆,交x轴与E1(右)点,做出如图中绿色虚线圆。然后以E1为圆心,半径为r做圆。看此时下一点(B)是否在该圆中。如果在,那么将该点标记变量变为true,再判下一点(C),如果不在那么就新增一个雷达。
还是原来的贪心思路,仍然先排序,但排序的准则是按红色圆与x轴左交点的先后顺序。
如图,如果B点圆(且如此称呼)的左交点(J1点)在A点圆右交点(E1)左侧,那么B点一定涵盖在A点圆内部。再如图,如果D点圆的左交点(图中未标示)在A点圆的右交点(未标示)右,则D点不在A点圆中。
Radar Installation
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 38208 | Accepted: 8483 |
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#include<iostream> #include<cmath> using namespace std; typedef struct { double l,r; }in; int cmp(const void *a, const void *b) { return (*(in *)a).l >= (*(in *)b).l ? 1:-1; } int main() { int n,d,i,x,y,sw,re,count = 1; double pre; in p[1000]; while(1) { cin>>n>>d; if(n == 0 && d==0) break; sw = 1; for(i=0;i<n;i++) { cin>>x>>y; if(d>=y&&sw==1) { p[i].l = x-sqrt((double)d*d - (double)y*y); p[i].r = x+sqrt((double)d*d - (double)y*y); } else { sw = 0; } } if(sw == 0) { cout<<"Case "<<count++<<": "<<-1<<endl; continue; } qsort(p,n,sizeof(in),cmp); re = 1; pre = p[0].r; for(i=1;i<n;i++) { if(p[i].l>pre) { re++; pre = p[i].r; } else { if(p[i].r<pre) { pre = p[i].r; } } } cout<<"Case "<<count++<<": "<<re<<endl; } return 0; }
Case 2: 1Source
题目的意思就是给你一个坐标轴,雷达在x轴上,岛屿分布在x轴上方,给你岛屿的坐标以及雷达的最大扫描面积,求最少用几个雷达可以将所有的岛屿覆盖!
思路:
以岛为圆心,以d为半径画圆(d是雷达的辐射半径),其与x轴相交的区间为一个区 这样就变成了在区间内找最少的点问题了