北大ACM1328——Radar Installation~~贪心

来源:互联网 发布:数据库元组 编辑:程序博客网 时间:2024/05/29 08:36

题目的大概意思是:给你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;}


0 0