题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1328
该题需要解决的具体问题有
1,根据每个岛的位置找到能辐射到该岛的雷达的有效区间。
2,如果多个区间有公共部分,那么只要将雷达放到这个公共区间就可以辐射到所有这些岛。
3,根据1的结果和2的理论,需要找到尽可能少的公共区间,使每个公共区间牵涉的岛屿最多,这个过程用到了贪心策略。
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define MAX 1000
struct Range
{
double left;
double right;
};
bool pred(Range r1,Range r2)
{
return r1.left < r2.left;
}
int main()
{
// freopen("in.txt","r",stdin);
Range r[MAX];
int i,j,x,y,n,d,res,test;
double tmp;
bool flag;
test = 1;
while(cin >> n >> d)
{
if(n == 0 && d == 0)
break;
cout << "Case " << test << ": ";
++test;
flag = true;
for(i = 0;i < n;++i)
{
cin >> x >> y;
if(flag && d >= y)
{
tmp = sqrt(d*d - y*y);
r[i].left = x - tmp;
r[i].right = x + tmp;
}
else
{
flag = false;
continue;
}
}
if(!flag)
cout << -1 << endl;
else
{
sort(r,r + n,pred);
res = 1;
for(i = 1,j = 0;i < n;++i)
{
if(r[i].left > r[j].right)
{
++res;
j = i;
}
else
{
if(r[i].right < r[j].right)
j = i;
}
}
cout << res << endl;
}
}
return 0;
}