标签:
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.
Input
The input consists of several test cases. The first line of each case contains two integers
n(1n
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 2
1 2
-3 1
2 1
1 2
0 2
0 0
Sample Output
Case 1: 2
Case 2: 1
题意:
题意:假设海岸线是一条无限延伸的直线,陆地在海岸线的一侧,而海洋在另一侧。每一个小的岛屿是海洋上的一个点,雷达坐落于海岸线上,只能覆盖d距离,所以如果小岛能够被覆盖到的话,它们之间的距离最多为d,题目要求计算出能够覆盖给出的所有岛屿的最少雷达数目。果不能覆盖,输出-1。
思路:我们可以以点来做半径为d的圆,与x轴的相交,如果不相交那么肯定完不成任务,反之就转化成了区间选点问题。
代码:
<span style="font-size:14px;">#include<stdio.h> #include<iostream> #include<math.h> #include<algorithm>//sort所在的库文件,排序用 using namespace std; const int MAXN=1005; struct Line { double l,r; }line[MAXN];//每个岛作半径为d的圆,与x轴所截的线段 bool cmp(Line a,Line b) { return a.l<b.l; } //按照线段的左端点从小到大排序 int main() { //freopen("test.in","r",stdin); //freopen("test.out","w",stdout); int n,d; int i; int x,y; bool yes;//确定是不是有解 int icase=1; while(cin>>n>>d) { yes=true; int cnt=0; if(n==0&&d==0)break; for(i=0;i<n;i++) { cin>>x>>y; if(yes==false)continue; if(y>d)yes=false; else { line[i].l=(double)x-sqrt((double)d*d-y*y); line[i].r=(double)x+sqrt((double)d*d-y*y); } } if(yes==false) { cout<<"Case "<<icase++<<": -1"<<endl; continue; } sort(line,line+n,cmp); cnt++; double now=line[0].r; for(i=1;i<n;i++) { if(line[i].r<now) now=line[i].r; else if(now<line[i].l) { now=line[i].r; cnt++; } } cout<<"Case "<<icase++<<": "<<cnt<<endl; } return 0; }</span>
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/a1967919189/article/details/47378575