>Link
ybtoj雷达装置
>解题思路
数学知识可求,一般的坐标点可以够到的符合条件的雷达,在x轴上是一段有左右端点( l 、 r l、r l、r)的区间,我们把这 n n n个区间存下
这样就转换成求最少用多少个点可以够到所有的区间了
我们把这 n n n个区间按照 r r r端点从小到大排,每次记录上一个雷达的位置,如果雷达在当前区间内,就使用这个雷达,否则就在 r r r端点建立一个新雷达。这样可以使一个雷达够到的区间最多,也就是在重合最厚的部分建雷达。
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define db double
#define N 1010
using namespace std;
struct node
{
int x, y;
db l, r;
} a[N];
int n, d, ans;
db p;
bool cmp (node aa, node bb)
{
if (aa.r != bb.r) return aa.r < bb.r;
return aa.l < bb.l;
}
int main()
{
scanf ("%d%d", &n, &d);
for (int i = 1; i <= n; i++)
{
scanf ("%d%d", &a[i].x, &a[i].y);
a[i].l = a[i].x - (db)sqrt (d * d - a[i].y * a[i].y);
a[i].r = a[i].x + (db)sqrt (d * d - a[i].y * a[i].y);
}
for (int i = 1; i <= n; i++)
if (d < abs (a[i].y)) {
printf ("-1"); return 0;}
sort (a + 1, a + 1 + n, cmp);
ans = 1, p = a[1].r;
for (int i = 2; i <= n; i++)
{
if (a[i].l <= p && p <= a[i].r) continue;
ans++;
p = a[i].r;
}
printf ("%d", ans);
return 0;
}