雷达装置
ybtoj 贪心-1-2
题目大意
在平面直角坐标系中有n个点,现在让你在x轴上布置雷达,雷达可以的侦查半径为d,问你最少布置多少个雷达
输入样例
3 2
1 2
-3 1
2 1
输出样例
2
数据范围
1⩽n⩽1031\leqslant n \leqslant 10^31⩽n⩽103
解题思路
首先通过勾股定理求出侦查该点的雷达x坐标范围
然后按范围的右端坐标排序
第一个雷达放在第一个点的右端坐标
然后每次判断上一个点是否在范围内
如果不在就再建一个
代码
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define abs(y) (y>0?y:-y)
using namespace std;
int n, ans;
double d, x, y, g;
struct node
{double l, r;
}a[1010];
bool cmp(node a, node b)
{return a.r < b.r;
}
int main()
{scanf("%d%lf", &n, &d);for (int i = 1; i <= n; ++i){scanf("%lf%lf", &x, &y);if (abs(y) > d)//无法达到{printf("-1");return 0;}a[i].l = x - sqrt((d * d - y * y));//左右端a[i].r = x + sqrt((d * d - y * y));}sort(a+1,a+1+n,cmp);ans = 1;g = a[1].r;//范围的右端for (int i = 2; i <= n; ++i)if (a[i].l > g) g = a[i].r, ans++;printf("%d", ans);return 0;
}