【AcWing】蓝桥杯集训每日一题Day15|并查集|528.奶酪(C++)

528.奶酪
528. 奶酪 - AcWing题库
难度:简单
时/空限制:1s / 128MB
总通过数:3800
总尝试数:10480
来源:

NOIP2017提高组
算法标签

并查集BFSDFS

题目内容

现有一块大奶酪,它的高度为 ℎ,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多半径相同的球形空洞。
我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为 z=0,奶酪的上表面为 z=h。
现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐标。
如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞
特别地,如果一个空洞与下表面相切或是相交,Jerry 则可以从奶酪下表面跑进空洞;如果一个空洞与上表面相切或是相交,Jerry 则可以从空洞跑到奶酪上表面。
位于奶酪下表面的 Jerry 想知道,在不破坏奶酪的情况下,能否利用已有的空洞跑到奶酪的上表面去? 
空间内两点 P1(x1,y1,z1)、P2(x2,y2,z2) 的距离公式如下:
d i s t ( P 1 , P 2 ) = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 + ( z 1 − z 2 ) dist(P_{1},P_{2})=\sqrt{ (x_{1}-x_{2})^2+(y_{1}-y_{2})^2+(z_{1}-z_{2}) } dist(P1,P2)=(x1x2)2+(y1y2)2+(z1z2)

输入格式

每个输入文件包含多组数据。  
输入文件的第一行,包含一个正整数 T,代表该输入文件中所含的数据组数。  
接下来是 T 组数据,每组数据的格式如下:
第一行包含三个正整数 n,ℎ 和 r,两个数之间以一个空格分开,分别代表奶酪中空洞的数量,奶酪的高度和空洞的半径。  
接下来的 n 行,每行包含三个整数 x、y、z,两个数之间以一个空格分开,表示空洞球心坐标为 (x,y,z)。

输出格式

输出文件包含 T 行,分别对应 T 组数据的答案,如果在第 i 组数据中,Jerry 能从下表面跑到上表面,则输出 Yes,如果不能,则输出 No

数据范围

1≤n≤1000,
1≤h,r≤10^9,
T≤20,
坐标的绝对值不超过10^9

输入样例:
3 
2 4 1 
0 0 1 
0 0 3 
2 5 1 
0 0 1 
0 0 4 
2 5 2 
0 0 2 
2 0 4
输出样例:
Yes
No
Yes
题目解析

有一块大奶酪,是一个三维问题,有上边界和下边界,左右两边是无限长的,下边界的坐标是z=0,上边界的坐标是z=h
其中有很多的洞,所有的球的半径都是固定的,是r
有可能给到上边界上边,这时认为这个洞不存在
如果和边界相交,可以认为这个洞只有一半
只要两个球相交或者相切,就可以认为这两个球的空间是连通的,这个老鼠就可以互穿,如果这个球和上边界相切的话,就认为老鼠和上面的区域是连通的,如果洞和下边界相切,就可以认为老鼠可以通过这个洞和下面的区域连通

问上边界和下边界整个是不是连通的,从下边界能不能通过一些洞到上边界,可以输出YES,否则输出NO

最多一共有1000个球,最多包含20个数据,

可以看作一个图

可以把每个球看作是图论中的一个点,如果两个球,它们是相交或相切的,就可以连条边,整个上边界可以看成一个点,整个下边界可以看成是一个点,

  1. 如果一个球和上边界是连通的,就从这个球到上边界的这个点连一条边
  2. 如果一个球和下边界是连通的,就从这个球的点到下边界连一条边
    下边界的点可以标记为S,上边界的点可以标记为T。
    边都是相互的,是一个无向图
方法

给一个无向图,问S和T是不是连通的
方法有很多

  1. 图的遍历
    1. BFS
    2. DFs
  2. 并查集
    1. 两个点如果是连通的,就把这两个点所在的集合合并,合并完之后,只要看一下S和T是不是在一个集合里,就可以了
如何建边

N很小,只有1000
所以可以直接暴力枚举每两个球是不是连通的,N^2枚举一遍
1000个点最多100万条边

不管是并查集还是图的遍历,时间复杂度都是O(N+M),所以时间复杂度都是 1 0 6 10^6 106级别
一共有20个数据,每一个测试数据包含20个测试点,所以每个测试数据,整个的运行时间是 20 ∗ 1 0 6 20*10^6 20106,2000万的计算量,是可以过的

如何判断两个球是不是连通的

在空间中求一下两个球心的距离
如果两个球心的距离刚好是两倍的半径的话,就是相切
如果大于2r,就是相离
如果小于2r,就是相交

求距离的时候可以直接根据数学公式来写,这样写会涉及到浮点数,浮点数比较大小的时候,C++里边,需要处理一下精度问题,
如何判断A小于等于B:A < B + eps,这个eps是可以调的,一般是 1 0 − 8 10^{-8} 108
如何判断A小于B:A < B - eps
如何判断A等于B:|A-B| < eps

如果不想处理精度问题,可以用整数来做,把等式两边平方一下,就变成和 4 r 2 4r^2 4r2比较

代码
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;const int N = 1010;//定义一个结构体来存储球
int n, h, r;
struct Sphere
{//球心坐标int x, y, z;
}q[N];//p是并查集代表元素数组
int p[N];//并查集模板
int find(int x)
{if (p[x] != x) p[x] = find(p[x]);return p[x];
}int main()
{//定义一下测试数据的数量int T;scanf("%d", &T);while (T --){//读入一个点数scanf("%d%d%d", &n, &h, &r);//初始化并查集,下边界的点是0,上边界的点是n+1,中间点的编号是1~nfor (int i = 0; i <= n + 1; i ++) p[i] = i;//依次读入每个点for (int i = 1; i <= n; i ++){int x, y, z;scanf("%d%d%d", &x, &y, &z);//把每个点的坐标存下来q[i] = {x, y, z};//判断一下球什么时候和上下边界的距离小于等于rif (abs(z) <= r) p[find(i)] = find(0);if (abs(z - h) <= r) p[find(i)] = find(n + 1);}//枚举一下所有中间的球for (int i = 1; i <= n; i ++)for (int j = 1; j < i; j ++){//求出坐标的差值LL dx = q[i].x - q[j].x;LL dy = q[i].y - q[j].y;LL dz = q[i].z - q[j].z;if (dx * dx + dy * dy + dz * dz <= 4 * (LL)r * (LL)r)p[find(i)] = find(j);}if (find(0) == find(n + 1)) puts("Yes");else puts("No");}return 0;
}

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

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

相关文章

Java并发编程和JUC

Java并发编程、JUC&#xff08;java.util.concurrent包&#xff09; 参考&#xff1a;JUC详解 概念辨析 进程、线程、管程 进程 进程&#xff1a;进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。 它是操作系统动态执行的基本单元&#xff0c;是操作系统…

【机器学习300问】66、均方误差与交叉熵误差,两种损失函数的区别?

一、均方误差&#xff08;Mean Squared Error, MSE&#xff09; 假设你是一个教练&#xff0c;在指导学生射箭。每次射箭后&#xff0c;你可以测量子弹的落点距离靶心的差距&#xff08;误差&#xff09;。MSE就像是计算所以射击误差的平方后的平均值。它强调了每一次偏离靶心的…

2024.04.01校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 2024届零跑汽车春季校园招聘正式启动&#xff08;内推&#xff09; 校招 | 2024届零跑汽车春季校园招聘正式启动&#xff08;内推&#xff09; 2、校招 & 实习 | 航天二院2…

了解 Vue 工程化开发中的组件通信

目录 1. 组件通信语法 1.1. 什么是组件通信&#xff1f; 1.2. 为什么要使用组件通信&#xff1f; 1.3. 组件之间有哪些关系&#xff08;组件关系分类&#xff09;&#xff1f; 1.4. 组件通信方案有哪几类 &#xff1f; 2. 父子通信流程图 3. 父传子 3.1. 父传子核心流程…

力扣练习题(2024/4/14)

1接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2…

SpringBoot 整合RocketMQ

目录 一、引入依赖 二、配置文件 三、生产者 四、消费者 五、结果 一、引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </d…

leetcode热题100.爬楼梯(从二进制到快速幂)

Problem: 70. 爬楼梯 文章目录 题目思路Code复杂度 题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方…

numpy学习笔记(5),其他实用函数

8. 更多函数 8.1 随机数 8.1.1 常用随机数 8.1.1.1 numpy.random.rand(d0, d1, …, dn) 返回[0.0, 1.0)随机浮点数&#xff0c;即大于等于0.0&#xff0c;小于1.0。d0, d1, …, dn&#xff1a;返回的数组形状 # 使用numpy.random.rand函数 import numpy as np np.random.r…

每日一题:无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无重…

2009-2021年上市公司僵尸企业识别数据(含原始数据+计算代码+计算结果)

2009-2021年上市公司僵尸企业识别数据&#xff08;含原始数据计算代码计算结果&#xff09; 1、时间&#xff1a;2009-2021年 2、指标&#xff1a; 证券代码 、证券简称、上市日期、year、净利润、政府补助、流动负债合计、负债合计、财务费用明细利息支出、资产总计、长期负…

SpringBoot中的常见注解详细介绍,附带代码示例

注意&#xff1a;本文不仅含有SpringBoot中常见的注解&#xff0c;还有其它框架的注解。因为注解之间会相互配合使用&#xff0c;所以每一个注解的示例与其他的注解都会有部分相似&#xff0c;请选择查看。 文章目录 01、SpringBootApplication02、Configuration03、EnableAuto…

算法设计中的一些核心原则

1.命名并实体化一切非自解释的概念 这是算法设计的核心原则之一。可以进一步归结为&#xff1a;你不可让逻辑匿名地裸露出来。你必须命名一切你知晓的概念&#xff0c;并且通过注释、适当的代码粒度管理&#xff0c;命名&#xff0c;妥善封装这些概念&#xff0c;比如&#xf…

(Oracle)SQL优化案例:隐式转换优化

项目场景 项目现场的某个kettle模型执行非常缓慢&#xff0c;原因在于某个SQL执行效率非常的低。甲方得知此事要求公司赶紧优化&#xff0c;负责该模块的同事对SQL优化并不熟悉。所以作为一个立志成为优秀DBA的ETL工程师&#xff0c;我自告奋勇&#xff1a;不是DBA&#xff0c;…

ES6 关于Class类的继承 extends(2024-04-10)

1、简介 类Class 可以通过extends关键字实现继承&#xff0c;让子类继承父类的属性和方法。extends 的写法比 ES5 的原型链继承&#xff0c;要清晰和方便很多。 class Foo {constructor(x, y) {this.x x;this.y y;console.log(父类构造函数)}toString() {return ( this.x …

《由浅入深学习SAP财务》:第2章 总账模块 - 2.7 总账模块报表 -2.7.1 对外报表:资产负债表及利润表

总账模块报表既包括对外报告的资产负债表、损益表、现金流量表&#xff0c;也包括企业自身用于查询和分析的各类报表&#xff0c;如科目余额表等。 2.7.1 对外报表&#xff1a;资产负债表及利润表 在SAP中&#xff0c;出具资产负债表和利润表的标准方法是先在后台建立一套“会…

971: 统计利用先序遍历创建的二叉树的深度

解法&#xff1a; 1.先序遍历创建二叉树链表形式 2.求二叉树的深度 用后序遍历实现&#xff1a; 1.后序遍历求节点A左右子树高度 2.对节点A&#xff1a; 1.取左右子树较大高度 2.返回高度1&#xff08;即以节点A为根节点的子树的最大深度&#xff09; 例如 #include <ios…

LINUX命令行后台运行matlab程序

UBUNTU安装了matlab&#xff0c;需要后台运行matlab程序。 一、MobaXterm程序&#xff08;非后台&#xff09; 使用mobaxterm程序&#xff0c;ssh连接ubuntu&#xff0c;在对应账号中输入matlab&#xff0c;即可基于mobaxterm自带的Xserver可视化界面&#xff0c;打开matlab界…

多多采集器使用指南 拼多多商家爬虫工具介绍

多多采集器是一款功能强大的数据采集工具&#xff0c;特别适用于拼多多商家爬虫任务。它可以帮助用户快速、高效地采集拼多多商家的信息&#xff0c;并提供了丰富的数据处理和导出功能。本文将介绍多多采集器的基本使用方法&#xff0c;并附带示例代码来演示如何使用多多采集器…

RobotFramework功能自动化测试框架基础篇

概念 RobotFramework是什么&#xff1f; Robot Framework是一款python编写的功能自动化测试框架。具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端或者接口&#xff0c;可以进行分布式测试执行。主要用于轮次很多的验收测试和验收测试…

网页的基本结构

VScode中HTML的自动补全&#xff1a; 自动补全&#xff1a;例如标签 <h1></h1> 1.输入<h1>后其会自动给其补全 2. 进输入h1 tab键 网页的基本结构&#xff1a; 网页的基本结构只需要在VScode当中输入&#xff1a;&#xff01; tab键即可 <!DOCTYPE html…