【HAOI2014】遥感监测

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

原题:

外星人指的是地球以外的智慧生命。外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本形式的认识。比如,我们所知的任何生命都离不开液态水,并且都是基于化学元素碳(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是为了防止一个圆被删两次

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int oo=168430090;
 8 const double eps=1e-8;
 9 int rd(){int z=0,mk=1;  char ch=getchar();
10     while(ch<'0'||ch>'9'){if(ch=='-')mk=-1;  ch=getchar();}
11     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
12     return z*mk;
13 }
14 struct dcd{double x,y;}a[110];
15 inline double sqr(double x){  return x*x;}
16 inline double dstc(dcd x,dcd y){  return sqrt(sqr(abs(x.x-y.x))+sqr(abs(x.y-y.y)));}
17 int n,m;
18 int v[110];
19 bool cmp(dcd x,dcd y){  return (x.x==y.x)?(x.y>y.y):(x.x<y.x);}
20 int main(){//freopen("ddd.in","r",stdin);
21     cin>>n>>m;
22     for(int i=1;i<=n;++i)  a[i].x=rd(),a[i].y=rd();
23     sort(a+1,a+n+1,cmp);
24     dcd lst={-oo,0};
25     int ans=0;
26     for(int i=1;i<=n;++i)
27         if(dstc(lst,a[i])>m){
28             ++ans,v[i]=1,lst.x=a[i].x+sqrt(sqr(m*1.0)-sqr(a[i].y));
29             for(int j=i-1;j>=1 && dstc(lst,a[j])+eps<m;--j)  ans-=v[j],v[j]=0;
30             //cout<<lst.x<<endl;
31         }
32     cout<<ans<<endl;
33     return 0;
34 }
View Code

 

转载于:https://www.cnblogs.com/JSL2018/p/6490074.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值