独立博客被硬盘保护干掉了真不爽啊……

原题:

外星人指的是地球以外的智慧生命。外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本形式的认识。比如,我们所知的任何生命都离不开液态水,并且都是基于化学元素碳(C)的有机分子组合成的复杂有机体。
ZDM实验室的天文学家们已经执著地观测ZDM-99星球十多年了,这个被称为“战神”的红色星球让他如此着迷。在过去的十多年中,他经常有一些令人激动的发现。ZDM-99星球表面有着明显的明暗变化。对这些明暗区域,天文学家们已经细致地研究了很多年,并且绘制出了较为详尽的地图,那些暗区是陆地,而亮区则是湖泊和海洋。他们一直坚信有水的地方,一定有生命的痕迹。
这天晚上的观测条件实在是空前的好,ZDM-99星球也十分明亮,不时呈现出若干个激光点,天文学家们推定这些激光点极有可能存在地球以外的智慧生命。遗憾的是仅持续很短的一段时间,这些激光点就消失了。
ZDM实验室的射电望远镜观测的区域有限,只可以遥感检测到一个半径为R的圆形区域。为了能同时能检测到所有的激光点,ZDM实验室需要要在一个水平的直线上尽快地安装多个的射电望远镜来。 
不妨设,这条安放射电望远镜的水平直线为X轴,ZDM-99星球激光点就处在P1(x1,y1)P2(x2,y2)  ,...... ,Pn(xn,yn)。(忽略Z坐标)


ZDM实验室的天文学家们想知道,至少需要安装多少个射电望远镜才能检测到所有激光点。

这道题规定圆的y==0那是不是可以大力贪一波啊

还是贪心的一种经典方式,如果当前点不选,在后面不会对答案造成更多的贡献

按点的x坐标排序,最左边的点没有覆盖,如果不把它覆盖掉就不满足条件,如果要覆盖,圆心在这个点的右边且圆刚好贴这这个点是最优的选择

因为如果圆心在最优选择的左边,他不会让更多的点加入覆盖(前面的都覆盖过了),也不会对答案产生更多贡献(反而会减少)

所以可以根据最左边的没有被覆盖的点直接计算出下一个圆圆心的位置

但是酱是有反例的:

这种情况只需要两个圆就够了,但是上面的做法却花了三个

所以还要再判断新添的一个圆能不能取消以前的圆

具体做法就是设v[i]表示在第i个点有没有新添一个圆,每次新添圆后往前找,如果点j在新添的圆内,就把答案减去v[j]并把v[j]设为0,直到j不在新添的圆内

证明很简单,因为只有当第i个点是最左边的没有被覆盖的点时才会新添圆,这表示第i个点的圆覆盖的都是i后面的点,所以如果j到i之间的点都在新圆内,这些点之前被j的圆覆盖,现在把j的圆删掉后包括j在内都能被i的圆覆盖,状态依旧是合法的

答案中删掉v[j]后把v[j]设为0是为了防止一个圆被删两次

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int oo=;
const double eps=1e-;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
struct dcd{double x,y;}a[];
inline double sqr(double x){ return x*x;}
inline double dstc(dcd x,dcd y){ return sqrt(sqr(abs(x.x-y.x))+sqr(abs(x.y-y.y)));}
int n,m;
int v[];
bool cmp(dcd x,dcd y){ return (x.x==y.x)?(x.y>y.y):(x.x<y.x);}
int main(){//freopen("ddd.in","r",stdin);
cin>>n>>m;
for(int i=;i<=n;++i) a[i].x=rd(),a[i].y=rd();
sort(a+,a+n+,cmp);
dcd lst={-oo,};
int ans=;
for(int i=;i<=n;++i)
if(dstc(lst,a[i])>m){
++ans,v[i]=,lst.x=a[i].x+sqrt(sqr(m*1.0)-sqr(a[i].y));
for(int j=i-;j>= && dstc(lst,a[j])+eps<m;--j) ans-=v[j],v[j]=;
//cout<<lst.x<<endl;
}
cout<<ans<<endl;
return ;
}

【HAOI2014】遥感监测的更多相关文章

  1. 【文文殿下】P3737 [HAOI2014]遥感监测

    题解 显然可以把每个观测点,认为是x轴上的一段区间.问题就转换为了:对于x轴上的若干个区间,选取尽可能少的点,使得所有区间都有至少一个点. 这是一个相当经典的贪心问题. 代码如下: #include& ...

  2. 【bzoj5166】[HAOI2014]遥感监测 贪心

    题目描述 给出平面上 $n$ 个圆,在x轴上选出尽可能少的点,使得每个圆中至少有一个点.求这个最小点数. 输入 第1行: N R 分别表示激光点的个数和射电望远镜能检测到的半径 第2~N+1行: Xi ...

  3. HAOI2014 遥感监测

    题目链接:戳我 比较水的一个题,直接处理点,找在直线上的可以覆盖到它的区间,然后做最小线段覆盖即可: 代码如下: #include<iostream> #include<cstdio ...

  4. 林业资源遥感航拍监测GIS系统

    航拍监测.遥感监测在林业有害生物(松材线虫病监测).森林防火监测.森林滥砍滥伐.林地侵占.林地违规开发监测等方面应用,将大大提升林业资源监测水平, 针对已有森林资源大量流失,滥砍滥伐现象普遍存在的事实 ...

  5. 关于TM影像各波段组合的简介

    321:真彩色合成,即3.2.1波段分别赋予红.绿.蓝色,则获得自然彩色合成图像,图像的色彩与原地区或景物的实际色彩一致,适合于非遥感应用专业人员使用. 432:标准假彩色合成,即4.3.2波段分别赋 ...

  6. 视频透雾原理加视频增强Retinex算法介绍

    (本文转自:http://www.syphong.cn/52-1.html#) 视频透雾原理加视频增强Retinex算法介绍 -上海凯视力成 钟建军 一. 视频增强的背景 视觉信息是人类获得外界信息的 ...

  7. 第四周:卷积神经网络 part 3

    第四周:卷积神经网络 part 3 视频学习 语义分割中的自注意力机制和低秩重建 语义分割(Semantic Segmentation) 概念:语义分割是在像素级别上的分类,属于同一类的像素都要被归为 ...

  8. <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  9. 分享|智慧环保-生态文明信息化解决方案(附PDF)

    内容摘要: 生态文明建设被提到前所未有的战略高度,我们既要绿水青山,也要金山银山.宁要绿水青山,不要金山银山,而且绿水青山就是金山银山.要正确处理好经济发展同生态环境保护的关系,牢固树立保护生态环境就 ...

随机推荐

  1. Mac 无需网线创建ipv6环境

    首先需要准备Mac一台 iPhone 2部(其中一部用于测试你的项目,请装上你的应用) 连接线一根 第一步:通过数据线连接iphone和mac 第二步:打开iphone的个人热点并选择仅USB 如果没 ...

  2. java中的方法method

    java中的方法必须存在于类class里,不能独立存在.类是描述具有某种特征的事物,方法则是这类 事物具有的某种功能,通过调用方法可以实现某种特定的功能.方法名一般以小写的动词开头. 例: publi ...

  3. Scrapy结构

    http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html scrapy 使用Twisted 这个异步网络库来处理网络通信,使用pyt ...

  4. Myeclipse代码格式化

    Shift+Ctrl+F 别和搜狗输入法冲突,把搜狗输入法的设置取消掉. 当然,还可以设置,自动格式化: 步骤:

  5. jdk8-全新时间和日期api

    1.jdk8日期和时间api是线程安全的 1.java.time  处理日期时间 2.java.time.temporal: 时间校正器.获取每个月第一天,周几等等 3.java.time.forma ...

  6. 关于这次安装Oracle

    前后大概经历了一个星期,今天下午(先是用的Navicat)当我尝试性的把用户名上方的复选项从服务名换成SID时,竟然瞬间连接成功了,整个人都是蒙B的,这样就好了? 之后我又用PLsql测试了一下,秒进 ...

  7. 强化学习4-时序差分TD

    之前讲到强化学习在不基于模型时可以用蒙特卡罗方法求解,但是蒙特卡罗方法需要在每次采样时生产完整序列,而在现实中,我们很可能无法生成完整序列,那么又该如何解决这类强化学习问题呢? 由贝尔曼方程 vπ(s ...

  8. base64encode 编码原理

    Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用 ...

  9. python-oop的理解

    OOP是面向对象编程,特征分别是封装.继承.多态.抽象. 封装:封装是指将对象信息状态通过访问权限修饰符隐藏在对象内部,不允许外部程序直接访问,如果外部程序要访问对象内部,可以调用内部提供的get或s ...

  10. C# EditPlus环境设置

    C# EditPlus环境设置 先要设置环境变量   5.0的 C:\Program Files\MSBuild\12.0\Bin 6.0的  C:\Windows\Microsoft.NET\Fra ...