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