本题可以将雷达放在海岸线上,先处理出小岛们在x轴上放雷达有效的范围, 然后从第一个小岛有效范围的最右边开始放雷达,最大可能的能够多覆盖小岛
一开始定义一个结构体,重载小于号,以右端点排序
bool operator < (const Seg& w) const
{
return r < w.r;
}
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1010;
struct Seg
{
double l, r;
bool operator < (const Seg& w) const
{
return r < w.r;
}
}seg[N];
int n, d;
int main()
{
cin >> n >> d;
bool st = false;
for (int i = 0; i < n; i ++ )
{
double x, y;
cin >> x >> y;
if (y > d) st = true;
else
{
//映射出在海岸线上放雷达有效的区域
double len = sqrt(d * d - y * y);
seg[i].l = x - len, seg[i].r = x + len;
}
}
//按照右端点排序
sort(seg, seg + n);
//有不符合的点,输出-1
int cnt = 0;
if (st) cout << -1;
else
{
double end = -1e20;
for (int i = 0; i < n; i ++ )
{
if (end < seg[i].l)
{
cnt ++;
end = seg[i].r;
}
}
cout << cnt;
}
}