传送门

思路:

  采取贪心的思想。

  把每个岛屿看作圆心,以雷达的范围 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. mui 滑块开关 进度条 以及如何获取值

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  2. python 3 往Excel 中的写入内容但不覆盖原内容

    EXCEL 写入数据保持原样式 import xlwt import xlrd import xlutils import xlutils.copy class ExcelHandle(): def ...

  3. transition:all .2s

    all属性实际上是所有CSS属性的缩写,表示,所有的CSS属性都怎样怎样.

  4. Cestos7安装Elasticsearch5.4.3

    Elasticsearch及配件下载地址:https://www.elastic.co/cn/downloads 为了简单起见,我们使用tar文件. 在/usl下创建elk目录 一.安装elastic ...

  5. Socket,ServerSocket,WebSocket

    一 区别 首先来说下区别吧, Socket和ServerSocket 指传输层网络接口协议,是基于套接字的服务端和客户端实现. 而WebScoket是应用层协议,是客户端-服务器的异步通信方法,用于双 ...

  6. airsim 无法打开包括文件corecrt.h

    原因: 显示无法打开包括文件corecrt.h.在网上找了很多方法,最后综合起来发现,这个问题网上很多人反映,应该是vs2015的一个BUG,如果是选择"从父级或项目默认设置继承" ...

  7. JAVA微信支付代码(WeChatPay.java 才是调用类)

    微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/index.html MD5Util.java package weixin; import java.se ...

  8. cocos2d-x JS 定时器暂停方法

    this.scheduleOnce(function(){ this.addChild(Menugobtn);//要暂停执行的代码 }, 10);

  9. windows将文件夹映射为虚拟磁盘

    subst X: e:123 将e盘下的123文件夹映射为x盘,123的容量即x盘容量 subst X: /t 删除映射的x盘

  10. Python记录11:叠加多个装饰器+有参装饰器

    # import time## def timmer(func): #func=最原始的index的内存地址# def wrapper(*args,**kwargs):# start=time.tim ...