大体题意:
告诉你n 个点的坐标,求在x轴上至少找多少个点能够满足 至少存在一个点到那n 个点的距离小于等于D。
思路:
比较简单的题目,没想到1Y 了。
n 个点的坐标相当于告诉你了圆心,D就是半径,构造一个圆,在x轴的两个交点分别作为区间的左端点和右端点。
然后把n 个区间按照右端点排序,当下一个区间的左端点l 大于 这个区间的r 时,就改ans++ 新加一个点。否则不加,继续枚举!
因为没告诉你数据范围,一般这样数据范围比较小,随便写写就可以了!
详细见代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10000 + 10;
const double eps = 1e-8;
struct Node {
double l,r;
bool operator < (const Node & rhs) const {
return r < rhs.r;
}
}p[maxn];
int main(){
int l,d;
while(scanf("%d",&l) == 1){
scanf("%d",&d);
int n;
scanf("%d",&n);
for (int i = 0; i < n; ++i){
double x,y;
scanf("%lf %lf",&x,&y);
double l = x-sqrt(d*d-y*y);
double r = x+sqrt(d*d-y*y);
p[i].l = l; p[i].r = r;
}
sort(p,p+n);
int ans = 1,cur = p[0].r;
for (int i = 1; i < n; ++i){
if (p[i].l - cur > eps){
++ans;
cur = p[i].r;
}
}
printf("%d\n",ans);
}
return 0;
}