题目的大概意思是:给你N个坐标,雷达的半径为d,求至少安装多少个雷达才能将所有点覆盖。雷达都在 x 轴上,不能全部覆盖的就输出 -1.
思路大概是,先算出雷达覆盖每一个点的横坐标的范围。然后再来贪心求解有几个。
下面的是AC的代码:
#include <iostream> #include <algorithm> #include <cmath> using namespace std; class data { public: double x1, x2; }; data xy[1005]; int cmp(data a, data b) //从小到大排序 { return a.x1 < b.x1; } int main() { int n, d, flag; int f = 1; double x, y; while(cin >> n >> d && n + d) { flag = 0; for(int i = 0; i < n; i++) { cin >> x >> y; if(y > d) //如果纵坐标大于d,说明怎样都不能覆盖 flag = 1; xy[i].x1 = x - sqrt(d * d - y * y); //算出雷达可以在横坐标的左边的范围 xy[i].x2 = x + sqrt(d * d - y * y); //右边的范围 } if(flag) //不能的情况 { cout << "Case " << f++ << ": " << -1 << endl; continue; } sort(xy, xy + n, cmp); //排序 int count = 1; double temp = xy[0].x2; for(int j = 1; j < n; j++) //贪心求解 { if(xy[j].x2 < temp) temp = xy[j].x2; else if(xy[j].x1 > temp) { count++; temp = xy[j].x2; } } cout << "Case " << f++ << ": " << count << endl; } return 0; }
北大ACM1328——Radar Installation~~贪心
原文地址:http://blog.csdn.net/qq_25425023/article/details/46047415