QAQ
将问题稍微进行转化:将基站设为覆盖半径为 D。
则问题变为:每个基站的覆盖区域必须要有雷达
又因为雷达只能放在 X 轴上,所以每个基站覆盖的其实是一条线
段。
则问题变为:每条线段上必须要要有雷达
先把线段按照右端点排序;
对于最早的没有雷达的线段,把一个雷达放在它的右端点。
更新后面的雷达多少被覆盖到
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
bool vis[99999];
struct node{
double l,r;
}a[99999];
int comp(node x,node y)
{
return x.r<y.r;
}
int main()
{
int n,d;
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(y>d)
{
printf("-1\n");
return 0;
}
double xx=sqrt((d*d)-(y*y));
a[i].l=(double) x-xx;
a[i].r=(double) x+xx;
}
sort(a+1,a+n+1,comp);
int ans=0;
for(int i=1;i<=n;i++)
if(!vis[i])
{
for(int j=i+1;j<=n;j++)
if(a[i].r>=a[j].l) vis[j]=1;
vis[i]=1;
ans++;
//printf("%lf %lf\n",a[i].l,a[i].r);
}
printf("%d",ans);
return 0;
}