题解 P3737 【[HAOI2014]遥感监测】
感觉楼上写麻烦了,这道题还是蛮经典的。首先如果从坐标出发的话显然太麻烦了,所以不妨反一下我们从每一个点出发,从坐标轴上找到能覆盖的这个点的最左的和最右的点(放遥感)。然后就变成了统计点数使得所有的线段都被覆盖--最小点覆盖
至于这个直接贪一下就好了
#include <bits/stdc++.h>
#define re register
using namespace std;
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c<='9' && c>='0')
{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x*f;
}
const double eps = 1e-6;
int n,r;
struct node
{
double l,r;
} e[110];
int len;
inline void cal(int x,int y)
{
double deta;
deta=sqrt(r*r-y*y);
e[++len].l=x*1.0-deta;
e[len].r=x*1.0+deta;
}
bool cmp(node x,node y)
{
return x.r<y.r;
}
int ans;
double loc;
int main()
{
n=read(),r=read();
for(re int i=1; i<=n; ++i)
{
int x=read(),y=read();
cal(x,y);
}
sort(e+1,e+len+1,cmp);
loc=e[1].r;
++ans;
for(re int i=2; i<=len; ++i)
if(loc+eps<e[i].l) ans++,loc=e[i].r;
printf("%d\n",ans);
return 0;
}