传送门

思路:

  采取贪心的思想。

  把每个岛屿看作圆心,以雷达的范围 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. mybatis cloud not autowired

    mybatis代码生成器生成的mapper在service引用的时候报cloud not autowired.... 即是在pom.xml中配置了不过滤mapper文件,报错还在 其实这不影响使用,但 ...

  2. Codeforces 431C - k-Tree - [树形DP]

    题目链接:https://codeforces.com/problemset/problem/431/C 题意: 定义一个 $k$ 树,即所有节点都有 $k$ 个儿子节点,相应的这 $k$ 条边的权重 ...

  3. npm更新指定的组件

    1.例如:react-router已经更新到4.x版本,想要下载2.x版本,可以通过下面命令 npm install --save-dev react-router@2.8.1 或 npm insta ...

  4. threw exception [Handler processing failed; nested exception is java.lang.NoClassDefFoundError: com/dyuproject/protostuff/MapSchema$MessageFactory] with root cause

    错误记录 前几天朋友问我一个错误,顺便记录一下,关于redis 工具类,protostuff序列化报错. threw exception [Handler processing failed; nes ...

  5. python框架之Flask(2)-路由和视图&Session

    路由和视图 这一波主要是通过看源码加深对 Flask 中路由和视图的了解,可以先回顾一下装饰器的知识:[装饰器函数与进阶] 路由设置的两种方式 # 示例代码 from flask import Fla ...

  6. mysql 远程登录

    mysql -h 192.168.5.116 -P 3306 -u root -p123456

  7. java 和 c++ 实现的各种基础数据结构和算法

    https://github.com/phishman3579/java-algorithms-implementation https://github.com/xorz57/forest

  8. vue 之iview

    iView-admin2.0:https://admin.iviewui.com/ 组件:https://www.iviewui.com/docs/guide/install

  9. linux----------今天又遇到一个奇葩的问题,就是linux文件的权限已经是777了但是还是没有写入权限,按照下面的命令就解决了

    查看SELinux状态: 1./usr/sbin/sestatus -v  ##如果SELinux status参数为enabled即为开启状态 SELinux status:             ...

  10. CSS实现经典的三栏布局

    实现效果: 左右栏定宽,中间栏自适应 (有时候是固定高度) 1 . 绝对定位布局:position + margin <div class="container"> & ...