题意:n个点,距离为d,在x轴上选出最少的点,使得对于每个点都在x轴上存在这样的点两者距离小于d
思路:
贪心,相交的区间就是一个点
先算出每个点在x轴上的范围,储存在结构体中
然后排序
接下来就是贪心了
代码如下
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
struct node{
double l;
double r;
}point[100005];
bool cmp(node a,node b){
return a.l < b.l || (a.l == b.l && a.r < b.r);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int l,d,t;
while(scanf("%d%d%d",&l,&d,&t)!=EOF){
for(int i=0;i<t;i++){
int a,b;cin >> a>>b;
double left = 1,right = l;
left = a-sqrt(d*d*1.0-b*b*1.0);
right = a+sqrt(d*d*1.0-b*b*1.0);
point[i].l = left;
point[i].r = right;
}
sort(point,point+t,cmp);
double x,y;
x = point[0].l;
y = point[0].r;
int cnt = 1;
for(int i=1;i<t;i++){
if(point[i].l > y){
x = point[i].l;
y = point[i].r;
cnt++;
}
else{
x = point[i].l;
}
}
cout << cnt <<endl;
}
return 0;
}