题意:给定一个数 n 个点,和一个d,要求在x轴上选出尽量少的点,使得对于给定的每个点,都有一个选出的点离它的欧几里德距离不超过d。

析:首先这是一个贪心的题目,并且是区间选点问题,什么是区间选点呢,就是说在数轴上有 n 个闭区间,取尽量少的点,使得每个区间都至少有一个点。

一看是不是和这个题很相似,是的,那么区间哪里来呢?自己造呗,既然说是距离不超过d,意思就是在给定的点为圆心,以 d 为半径画圆,在x轴上的区间,

那么区间不就有了么,然后这个怎么贪心呢,是这样的,把所有的区间的右端点从小到大排序(如果相同,则左端点从大到小排),那么贪心策略就是一定取最后一个点,

也就是右端点,想一想为什么,也很好理解,尽量让多的区间都有这个点。那么这个题就很简单了。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std;
const int maxn = 1E5 + 5; struct node{
double l, r;
bool operator < (const node &p) const{
return r < p.r || (r == p.r && l > p.l);//排序
}
};
node a[maxn]; int main(){
// freopen("in.txt", "r", stdin);
int n;
double x, y, l, d;
while(scanf("%lf", &l) == 1){//l 并没有发现有什么用
scanf("%lf %d", &d, &n);
for(int i = 0; i < n; ++i){
scanf("%lf %lf", &x, &y);
a[i].l = x - sqrt(d*d - y*y);//计算左端点
a[i].r = x + sqrt(d*d - y*y);//计算右端点
} sort(a, a+n);
int cnt = 1;
double ans = a[0].r;//取最后一个点
for(int i = 0; i < n; ++i)
if(a[i].l > ans){//如果这个不包含了,先下一个右端点
++cnt;
ans = a[i].r;
} printf("%d\n", cnt);
}
return 0;
}

最新文章

  1. SQL注入攻防入门详解(2)
  2. JSON入门教程
  3. js中function参数默认值
  4. 理解和解决MySQL乱码问题
  5. javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher--转载
  6. 上架第一个APP到苹果商店被拒绝5次
  7. Mysql支持中文全文检索的插件mysqlcft-应用中的问题
  8. Hadoop-MapReduce之自定义数据类型
  9. 转: ubuntu配置NFS,挂载开发板
  10. 锁&#183;——lock关键字详解
  11. Android编程 获取网络连接状态 及调用网络配置界面
  12. winform/wpf 程序部署
  13. php数组和正则表达式的替换拆分匹配所有
  14. C++中 #if 和 #ifdef 区别
  15. SVD的基础详解
  16. JavaSE编程题
  17. Python中*args和**kwargs 的简单使用
  18. 20145212 罗天晨 WEB登陆发贴及会话管理功能的实现
  19. Ubuntu 网卡多个 IP 地址
  20. Sansa组件

热门文章

  1. 蚂蚁金服 Service Mesh 实践探索
  2. SQL2008如何清空压缩数据库日志
  3. XSS漏洞攻击原理与解决办法
  4. Serv-u只开放21端口连接不上解决方案
  5. 折腾一天,获取下列多选框的所有选中值,原生js可直接通过obj.val()来获取,可jq不行,要通过循环取值来获取;
  6. 源文件封装为IP的步骤
  7. python re示例
  8. centos7.3部署django用uwsgi和nginx[亲测可用]
  9. could not be installed at this time
  10. eclipse自动生成.apt_generated、factory path