题目大意:
假设有一条无限长的海岸线,海岸线以上部分有n个岛屿。在海岸线上有雷达,每个雷达能够探测的范围为半径为r的圆,当且仅当一个岛屿与雷达的距离小于等于r时,岛屿能被雷达探测到。给出所有岛屿的坐标和雷达的半径。求最少需要用多少个雷达,使得所有的岛屿都被探测到。
图中ABCD为海岛的位置。假设本题半径为2(符合坐标系),那么A点坐标为(1,1)以此类推。
在题中,记录每个点的坐标,并把一个点新加一个标记变量以标记是否被访问过。
存储图中红色圆与X轴的交点。先排序,排序的准则是按红色圆与x轴左交点的先后顺序。
如图,如果B点圆(且如此称呼)的左交点(J1点)在A点圆右交点(E1)左侧,那么B点一定涵盖在A点圆内部。再如图,如果D点圆的左交点(图中未标示)在A点圆的右交点(未标示)右,则D点不在A点圆中。
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
struct point
{
double left, right;
}dp[1050];
int sum;
int cmp(point a, point b)
{
return a.left<b.left;
}
void solve(int n)
{
sort(dp, dp+n, cmp);
sum=1;
double std;
std=dp[0].right;
for(int i=1; i<n; ++i)
{
if(dp[i].left>std)
{
sum++;
std=dp[i].right;
}
else if(dp[i].right<std)
{
std=dp[i].right;
}
}
}
int main()
{
int n, r, x, y;
int t=1;
while(cin>>n>>r&&(n+r!=0))
{
int i, fail=0;
for(i=0; i<n; i++)
{
cin>>x>>y;
if(y>r)
fail=1;
else
{
double l=sqrt ((double)(r*r-y*y));
dp[i].left=x-l;
dp[i].right=x+l;
}
}
if(fail)
{
sum=-1;
cout<<"Case "<<t++<<": "<<sum<<endl;
}
else
{
solve(n);
cout<<"Case "<<t++<<": "<<sum<<endl;
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。