传送门

思路:

  采取贪心的思想。

  把每个岛屿看作圆心,以雷达的范围 d 为半径,求出与 x 轴的左右两个交点,两交点所夹的区间就需要放置一个雷达,这样就把这道题转换为了区间取点问题。在枚举岛屿时,记录之前最后一个雷达安放的位置 las ,如果岛屿在这个雷达的范围内,就跳过,否则,在该岛屿所在的区间右端点放一个雷达。

  为了代码比较好看,我打了一个巨大的结构体。

主函数部分:

int main()
{
n=T.resd();d=T.read();
for(LL i=;i<=n;i++)
{
t[i].x=T.read(),t[i].y=T.read();
t[i].l=T.deal_l(t[i].x,t[i].y);//计算出区间的左端点
t[i].r=T.deal_r(t[i].x,t[i].y);//计算出区间的右端点
}
sort(t+,t+n+,cmp);//按照区间右端点排序
las=t[].r;ans++;//放置第一个雷达,记录位置 las
for(LL i=;i<=n;i++)
{
dis=T.dist(t[i].x,t[i].y,las,);//计算岛屿与之前放置的最后一个雷达之间的距离
if(dis<=d) continue; else las=t[i].r,ans++;//若不在雷达范围内,在区间右端点放置一个雷达,更新 las。
}
printf("%lld\n",ans);
return ;
}

完整代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<set>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define maxn 2001
typedef long long LL;
LL n,ans;
double d,las,dis; struct hh
{
double x,y,l,r;bool bo; inline double read()
{
double ls;scanf("%lf",&ls);return ls;
} inline LL resd()
{
LL xs=,kr=;char ls;
ls=getchar();
while(!isdigit(ls))
{
if(!(ls^))
kr=-;
ls=getchar();
}
while(isdigit(ls))
{
xs=(xs<<)+(xs<<)+(ls^);
ls=getchar();
}
return xs*kr;
} inline double deal_l(double a,double b)
{
return a-sqrt(d*d-b*b);
} inline double deal_r(double a,double b)
{
return a+sqrt(d*d-b*b);
} inline double dist(double a1,double b1,double a2,double b2)
{
return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
} }t[maxn],T; inline bool cmp(const hh&a,const hh&b)
{
return a.r<b.r;
} int main()
{
n=T.resd();d=T.read();
for(LL i=;i<=n;i++)
{
t[i].x=T.read(),t[i].y=T.read();
t[i].l=T.deal_l(t[i].x,t[i].y);
t[i].r=T.deal_r(t[i].x,t[i].y);
}
sort(t+,t+n+,cmp);
las=t[].r;ans++;
for(LL i=;i<=n;i++)
{
dis=T.dist(t[i].x,t[i].y,las,);
if(dis<=d) continue;
else las=t[i].r,ans++;
}
printf("%lld\n",ans);
return ;
}

P1325 雷达安装的更多相关文章

  1. 洛谷 P1325 雷达安装 解题报告

    P1325 雷达安装 题目描述 描述: 假设海岸线是一条无限延伸的直线.它的一侧是陆地,另一侧是海洋.每一座小岛是在海面上的一个点.雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d ...

  2. 落谷p1325雷达安装(计算几何)

    传送门 //p1325雷达安装 //很明显雷达应该安装在海岸线上 //而为了满足一个点被覆盖那在区间[x - sqrt(d ^ 2 - y ^ 2), x + sqrt(d ^ 2 - y ^ 2)] ...

  3. luogu P1325 雷达安装

    题目描述 描述: 假设海岸线是一条无限延伸的直线.它的一侧是陆地,另一侧是海洋.每一座小岛是在海面上的一个点.雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d.你的任务是建立尽量少 ...

  4. 洛谷P1325 雷达安装

    题目 考虑对于一个小岛,如果有雷达可以覆盖它,则这些雷达肯定在一个区间里,则原题内容则变为区间选点问题 #include <bits/stdc++.h> using namespace s ...

  5. 【luogu1325】雷达安装--贪心

    题目描述 描述: 假设海岸线是一条无限延伸的直线.它的一侧是陆地,另一侧是海洋.每一座小岛是在海面上的一个点.雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d.你的任务是建立尽量少 ...

  6. luogu 1325 雷达安装

    题目链接 题意 在\(x\)轴上方有\(n\)个海岛,要在\(x\)轴建雷达,每个雷达的覆盖范围为半径为\(d\)的圆,问至少要建多少个雷达能覆盖所有海岛. 思路 对于每个海岛计算出雷达建立在什么范围 ...

  7. Poj1328Radar Installation雷达安装

    原题链接 经典贪心,转化为问题为,对于所有的区间,求最小的点数能使每个区间都至少有一个点. #include<iostream> #include<cstdio> #inclu ...

  8. Greedy:Radar Installation(POJ 1328)

    装雷达 题目大意,就是令在海岸线的(直线)一边是海(y>0),另一边是陆地(y<=0),在海岸线上装雷达,雷达可以覆盖的范围为d,海上有岛,(x,y),问你应该怎么装雷达,才能做到技能雷达 ...

  9. poj1328

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 73588   Accepted: 16 ...

随机推荐

  1. jquery 倒计时

    今天让我公司前端大神,李杨哥,给做了一个jquery倒计时功能  很牛逼 看下面的效果图 这个倒计时是需要传值的,看效果代码讲解  百度云盘 ,压缩包永久有效  链接: https://pan.bai ...

  2. Centos7 安装 Ipython的方法

    环境:Centos7 最小化安装yum源设置:阿里的base源和epel源python版本:2.7.5 yum install -y python2-pip.noarchyum install -y ...

  3. BeeHive小思考

    事件分发和事件处理 将所有行为注册为不同的时间类型,配置Module,让他们在事件发生时,响应这些事件(除了系统的事件,还可以注册自定义事件,触发自定义事件) Module注册之后应当会生成单例对象, ...

  4. python中的*args和**kw

    学习python装饰器decorator的时候遇到*args和**kw两种函数值传递. 在python中定义函数,可以使用一般参数.默认参数.非关键字参数和关键字参数. 一般参数和默认参数在前面的学习 ...

  5. qemu对虚拟机的内存管理(二)

    上篇文章主要分析了qemu中对虚拟机内存管理的关键数据结构及他们之间的联系,这篇文章则主要分析在地址空间发生变化时,如何将其更新至KVM中,保持用户空间与内核空间的同步. 这一系列操作与之前说的Add ...

  6. Visual Studio 2017使用Asp.Net Core构建Angular4应用程序

    文章转载请著名出处:http://www.cnblogs.com/smallprogram 你需要了解的名词 1. NodeJS,这是一个基于Chrome V8 JavaScript引擎构建的Java ...

  7. jdbc--取大量数据

    最近使用jdbc方式查询数据,保存为csv文件中.当然你可以在pl/sql中直接查出来,copy to excel就好了.但我想通过程序实现 @Test public void test() thro ...

  8. 006-mac下finder操作

    1. 在 Finder 窗口显示更多信息 打开任意 Finder 窗口.前往并打开「显示」-「显示路径栏」.「显示」-「显示状态栏」和「显示」-「显示预览」三项. 选择了显示路径栏 路径栏通常是从磁盘 ...

  9. java框架之SpringBoot(9)-数据访问及整合MyBatis

    简介 对于数据访问层,无论是 SQL 还是 NOSQL,SpringBoot 默认采用整合 SpringData 的方式进行统一处理,添加了大量的自动配置,引入了各种 Template.Reposit ...

  10. Linux下安装pymysql

    直接使用pip进行安装: [root@mycentos ~]#pip install pymysql