题解
显然可以把每个观测点,认为是x轴上的一段区间。问题就转换为了:对于x轴上的若干个区间,选取尽可能少的点,使得所有区间都有至少一个点。 这是一个相当经典的贪心问题。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
const int maxn = 110;
struct qwq {
int vis;
double x,y;
const bool operator < (const qwq& rhs) const {
if(vis||rhs.vis) return vis<rhs.vis;
if(x==rhs.x) return y<rhs.y;
return x < rhs.x;
}
}L[maxn];
int n,r;
bool inside(int a,int b) {
return L[b].x>=L[a].x&&L[b].y<=L[a].y;
}
int main() {
scanf("%d%d",&n,&r);
for(int i = 1;i<=n;++i) {
int x,y;
scanf("%d%d",&x,&y);
double l = sqrt(r*r-y*y);
L[i].x=x-l,L[i].y=x+l;
}
int cnt = 0;
for(int i = 1;i<=n;++i) {
for(int j =1;j<=n;++j) {
if(inside(i,j)&&i!=j&&!L[j].vis) {
L[i].vis=1;
++ cnt;
break;
}
}
}
std::sort(L+1,L+1+n);
n-=cnt;
double r = -100000000000LL;
int ans = 0;
for(int i = 1;i<=n;++i) {
if(L[i].x<=r) continue;
++ans;
r=L[i].y;
}
printf("%d
",ans);
return 0;
}