有n个二维坐标点。
现在要在x轴上放置若干雷达,每个雷达的辐射半径都是d。
问至少需要几个雷达,才能够幅射所有点,如果辐射不到所有的点,则输出-1。
输入
第一行一个整数n(1 \le n \le 1000)n(1≤n≤1000) 和 d(1 \le d \le 10000)d(1≤d≤10000)。
接下来n行,每行输入一个点的坐标。
坐标范围[-10000,10000]。
输出
输出一个整数表示答案。
样例
输入
复制
3 2 1 2 -3 1 2 1
输出
复制
2
输入
复制
1 2 0 2
输出
复制
1
提示
子任务1,20分,1 \le n \le 101≤n≤10 , 1 \le d \le 101≤d≤10,坐标范围[-10,10]。
子任务2,30分,1 \le n \le 1001≤n≤100 , 1 \le d \le 1001≤d≤100,坐标范围[-100,100]。
子任务3,50分,1 \le n \le 10001≤n≤1000 , 1 \le d \le 100001≤d≤10000,坐标范围[-10000,10000]。
#pragma warning(disable:4996) #include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <algorithm> #include <set> #define MAX 1001 using namespace std; int main() { int n, ans = 1; bool flag = true; double r, x, y; scanf("%d%lf", &n, &r); std::vector<std::pair<double, double>> range(n); for (int i = 0; i < n; i++) { scanf("%lf%lf", &x, &y); if (r < fabs(y)) { flag = false; } if (!flag) { continue; } double delta = sqrt(r * r - y * y); range[i] = std::make_pair(x - delta, x + delta); } if (flag) { std::sort(range.begin(), range.end(), [](const std::pair<double, double>& a, const std::pair<double, double>& b)->bool { if (a.second == b.second) { return a.first < b.first; } return a.second < b.second; }); double endPoint = range.begin()->second; for (int i = 0; i < n; i++) { if (range[i].first > endPoint) { ans++; endPoint = range[i].second; } } } printf("%d", flag ? ans : -1); return 0; }
如果觉得有帮助,点个推荐啦~