题目大意就是在平面直角坐标系中给定n个点,在x轴上建立尽可能少的信息发射站,在给定信息发射站的传输范围的情况下,求出最少建设的发射站使所有点都被覆盖。在平面直角坐标系中给定n个点,在x轴上建立尽可能少的信息发射站,在给定信息发射站的传输范围的情况下,求出最少建设的发射站使所有点都被覆盖。注意在每一次通过右端大于当前发射站的坐标而使区间出队后,都要判断一次队列是否为空。
代码如下
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
int main()
{
int n,d,cas = 0;
while(scanf("%d %d",&n,&d) && (n!=0||d!=0))
{
priority_queue<pair<double,double> > qj;
int flag = 1;
for(int i = 1;i <= n; i++)
{
int x,y;
scanf("%d %d",&x,&y);
if(d >= y)
{
double temp = sqrt(d * d - y * y);
qj.push(make_pair(x-temp,x+temp));
}
else flag = 0;
}
if(flag == 0)
{
printf("Case %d: -1\n",++cas);
continue;
}
int cnt = 0;
double ed = 0x3f3f3f3f;
while(!qj.empty())
{
while(!qj.empty() && qj.top().second >= ed)
qj.pop();
if(!qj.empty())
{
cnt++;
ed = qj.top().first;
}
}
printf("Case %d: %d\n",++cas,cnt);
}
return 0;
}