T428497 请不要抢走爱丽丝的工作! 题解

news/2025/3/11 19:06:49/文章来源:https://www.cnblogs.com/koishil/p/18765798

T428497 请不要抢走爱丽丝的工作! 题解

请不要抢走爱丽丝的工作

题目传送门

本题要求扫地机器人半径 \(r\) 的最大值,既然要求最大值,容易想到二分答案。
那问题就转换为给定半径 \(R\) , 判断 \(R\) 满不满足条件,也就是能不能找到一条绕过所有障碍的路径。让我们逆转一下思维,考虑哪些区域是机器人不能到达的。简单分析就能得到以下结论:

  1. 与边界的距离小于 \(R\) 的点是不能到达的,这些点形成了一个矩形区域
  2. 与某一个障碍物的距离小于 \(R\) 的点是不能到达的,这些点形成了一个圆形区域

把这些区域全都画出来,如果发现上边界和下边界被这些区域连到一起了,就说明不存在能绕过这些不可达区域的路径,反之则存在。
分析到这里显然是要用并查集来判断上边界和下边界是否连通了,如果某个障碍物与边界的距离小于 \(2\times{R}\) ,则将此障碍物与边界相连, 如果两个障碍物之间的距离小于 \(2\times{R}\),则将这两个障碍物相连。以下是AC代码:

#include <bits/stdc++.h>
#define MAXN 105
using namespace std;
int px[MAXN];
int py[MAXN];
double dis[MAXN][MAXN]; 
int pre[MAXN];int root(int x){return pre[x] = pre[x]==x?x:(root(pre[x]));
}void merge(int x,int y){x = root(x);y = root(y);if(x!=y) pre[x] = y;
}bool check(double m,int n){memset(pre,0,sizeof(pre));for(int i=0;i<MAXN;i++) pre[i] = i; // 101号设为上边界, 102号设为下边界for(int i=0;i<n;i++){if(100.0-py[i]<2*m) merge(101,i);if(py[i]+100.0<2*m) merge(102,i);}for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){if(dis[i][j]<2*m) merge(i,j);}}if(root(101)==root(102)) return true;else return false;
}void solve(){int n;cin >> n;memset(px,0,sizeof(px));memset(py,0,sizeof(py));memset(dis,0,sizeof(dis));for(int i=0;i<n;i++){cin >> px[i] >> py[i];}for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){dis[i][j] = dis[j][i] = sqrt(pow(px[i]-px[j],2)+pow(py[i]-py[j],2));}}double l = 0, r = 100, lm = 10000;while(l<=r){double m = (l+r)/2;if(abs(lm-m)<1e-6) break;lm = m;if(check(m,n)){r = m;}else{l = m;}}cout << lm;
}int main(){int t = 1;
//	cin >> t;while(t--){solve();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/897373.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人作业:软件案例分析

个人作业:软件案例分析项目 内容这个作业属于哪个课程 首页 - 2025年春季软件工程(罗杰、任健) - 北京航空航天大学 - 班级博客 - 博客园这个作业的要求在哪里 [I.2] 个人作业:软件案例分析我在这个课程的目标是 学习软件开发流程,完成一次完整的软件开发经历,提高开发和…

API 调试与管理工具选型思考:Apifox vs Apipost,企业究竟该如何选择

在企业级 API 调试与管理场景中,选择一款高效的工具至关重要。市面上的调试工具琳琅满目,而 Apifox 和 Apipost 是近几年两款备受开发者关注的 API 工具。二者都宣称为团队协作和接口调试赋能,但对企业来说,究竟谁才是更适合的选择呢?本文将从功能对比、用户体验、企业适配…

pos_cli 命令是如何运行起来的

追踪pos_cli --dump --dir /root/ckpt --pid [your program pid] 是如何运行的 pos_cli是通过mason,由sources包括的这些文件构建而来 #pos/cli/meson.buildproject_name = phoenix_os_cli project_name_abbreviation = pos_cli scan_src_path = meson.current_source_dir() +…

Tavus 发布对话轮次控制模型:能理解对话节奏和意图;百度推出 AI 情感陪伴应用月匣,整合 MiniMax 等模型丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

clickhouse 25.2.1 集群部署

依赖条件 sysctl.conf echo "kernel.threads-max = 262144" >> /etc/sysctl.conf && sysctl -p Huge Pages(按需修改) 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 参数中添加: GRUB_CMDLINE_LINUX="... transparent_hugepage=never"…

可视化图解算法:链表指定区间反转

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。1. 题目 描述 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 …

ov5640原理讲解

Camera开发-OV5640(MIPI)-CSDN博客

[I.2] 个人作业:软件案例分析

[I.2] 个人作业:软件案例分析项目 内容这个作业属于哪个工程 https://edu.cnblogs.com/campus/buaa/BUAA_SE_2025_LR这个作业的要求在哪里 https://edu.cnblogs.com/campus/buaa/BUAA_SE_2025_LR/homework/13367我在这个课程的目标是 学习团队软件开发方式, 丰富开发经验这个作…

应对SQLyog trial到期方式:删脚本!

(1)进入注册表中的HKEY_CURRENT_USER\SOFTWARE路径 (2)找到{d58cb4b1-47f3-45cb-a209-f298d0c3f756}文件夹 删除掉!! (3)到期了删一回

React18 React中的REF的使用

想要获取元素操作DOM,React中该怎么做呢?~ 首先肯定是要在DidMount周期函数中调用啦需要真实dom为前提嘛 1. 和VUE一样,可以使用this.$refs.xxx,结合元素中放置ref属性 【其实不推荐这样~】2.可以使用document.querySelector(xx)获取 3.把ref属性值设置为一个函数的形式获取…

3ds Max 2025下载与安装教程

Autodesk 3ds Max 是专业的三维建模、渲染和动画软件,可助您创建广阔的世界和优质的设计。使用强大的建模工具为环境和景观注入活力。 使用直观的纹理和明暗处理工具创建精细的设计和道具。 迭代和生成具有全方位艺术控制的专业级渲染‌3Dmax 2025的安装要求:‌操作系统‌:3…

Java多线程(一)---- 创建与使用

JUC Java多线程是一个非常复杂的知识点,今天这篇我们就来说说Java多线程的多种实现方式吧。 Thread 构造 Thread类可以说是非常基础的一个类了,通过继承Thread类,我们可以成功的创建一个“线程类”。 public class threadDemo {public static class threadDemo extends Thre…