题目如下:
思路 or 题解:
我们可以将问题转化成区间选点问题
对于每一个小岛,我们可以预处理出 雷达的可行区间位置
[
l
,
r
]
[l, r]
[l,r]
之后,问题就转变成区间选点问题了
我们通过sort, 进行贪心寻找答案。
AC 代码如下:
const int N = 100009;
int n, d;
struct nn
{
double l, r;
bool operator < (const nn &t) const
{
return r < t.r;
}
}s[N];
void solve()
{
cin >> n >> d;
bool ok = 1;
for (int i = 1; i <= n; i++)
{
int x, y; cin >> x >> y;
if (y > d)
{
ok = 0;
continue;
}
double len = sqrt(d * d - y * y);
s[i] = {x - len, x + len};
}
if (!ok)
{
cout << -1 << '\n';
return;
}
sort (s + 1, s + 1 + n);
int ans = 0;
double idx = -1e20;
for (int i = 1; i <= n; i++)
{
if (s[i].l > idx)
ans++, idx = s[i].r;
}
cout << ans << '\n';
}
int main()
{
buff;
solve();
}