2022-03-17:所有黑洞的中心点记录在holes数组里, 比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9), 并且所有黑洞的中心点都在左下角(0,0),右上角(
2022-03-17:所有黑洞的中心点记录在holes数组里,
 比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9),
 并且所有黑洞的中心点都在左下角(0,0),右上角(x,y)的区域里,
 飞船一旦开始进入黑洞,就会被吸进黑洞里。
 返回如果统一所有黑洞的半径,最大半径是多少,
 依然能保证飞船从(0,0)能到达(x,y)。
 来自美团。
答案2022-03-17:
二分答案+并查集。
代码用golang编写。代码如下:
package main
import (
	"fmt"
	"math"
)
func main() {
	holes := [][]int{{3, 5}, {6, 9}}
	x := 11
	y := 11
	fmt.Println(maxRadius(holes, x, y))
}
func maxRadius(holes [][]int, x, y int) int {
	L := 1
	R := getMax(x, y)
	ans := 0
	for L <= R {
		M := (L + R) / 2
		if ok(holes, M, x, y) {
			ans = M
			L = M + 1
		} else {
			R = M - 1
		}
	}
	return ans
}
func getMax(a, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}
func ok(holes [][]int, r, x, y int) bool {
	n := len(holes)
	uf := NewUnionFind(holes, n, r)
	for i := 0; i < n; i++ {
		for j := i; j < n; j++ {
			if touch(holes[i][0], holes[i][1], holes[j][0], holes[j][1], r) {
				uf.union(i, j)
			}
			if uf.block(i, x, y) {
				return false
			}
		}
	}
	return true
}
func touch(x1, y1, x2, y2, r int) bool {
	return (r<<1)*(r<<1) < abs(x1-x2)*abs(x1-x2)+abs(y1-y2)*abs(y1-y2)
	//return (r << 1) >= sqrt(abs(x1-x2)*abs(x1-x2)+abs(y1-y2)*abs(y1-y2))
}
func abs(a int) int {
	if a < 0 {
		return -a
	} else {
		return a
	}
}
func sqrt(a int) int {
	return int(math.Sqrt(float64(a)))
}
type UnionFind struct {
	father []int
	size   []int
	xmin   []int
	xmax   []int
	ymin   []int
	ymax   []int
	help   []int
}
func NewUnionFind(holes [][]int, n, r int) *UnionFind {
	ans := &UnionFind{}
	ans.father = make([]int, n)
	ans.size = make([]int, n)
	ans.xmin = make([]int, n)
	ans.xmax = make([]int, n)
	ans.ymin = make([]int, n)
	ans.ymax = make([]int, n)
	ans.help = make([]int, n)
	for i := 0; i < n; i++ {
		ans.father[i] = i
		ans.size[i] = 1
		ans.xmin[i] = holes[i][0] - r
		ans.xmax[i] = holes[i][0] + r
		ans.ymin[i] = holes[i][1] - r
		ans.ymax[i] = holes[i][1] + r
	}
	return ans
}
func (this *UnionFind) find(i int) int {
	hi := 0
	for i != this.father[i] {
		this.help[hi] = i
		hi++
		i = this.father[i]
	}
	for hi--; hi >= 0; hi-- {
		this.father[this.help[hi]] = i
	}
	return i
}
func (this *UnionFind) union(i, j int) {
	fatheri := this.find(i)
	fatherj := this.find(j)
	if fatheri != fatherj {
		sizei := this.size[fatheri]
		sizej := this.size[fatherj]
		big := twoSelectOne(sizei >= sizej, fatheri, fatherj)
		small := twoSelectOne(big == fatheri, fatherj, fatheri)
		this.father[small] = big
		this.size[big] = sizei + sizej
		this.xmin[big] = getMin(this.xmin[big], this.xmin[small])
		this.xmax[big] = getMax(this.xmax[big], this.xmax[small])
		this.ymin[big] = getMin(this.ymin[big], this.ymin[small])
		this.ymax[big] = getMax(this.ymax[big], this.ymax[small])
	}
}
func getMin(a, b int) int {
	if a < b {
		return a
	} else {
		return b
	}
}
func twoSelectOne(c bool, a, b int) int {
	if c {
		return a
	} else {
		return b
	}
}
func (this *UnionFind) block(i, x, y int) bool {
	i = this.find(i)
	return (this.xmin[i] <= 0 && this.xmax[i] >= x) ||
		(this.ymin[i] <= 0 && this.ymax[i] >= y) ||
		(this.xmin[i] <= 0 && this.ymin[i] <= 0) ||
		(this.xmax[i] >= x && this.ymax[i] >= y)
}
执行结果如下:

2022-03-17:所有黑洞的中心点记录在holes数组里, 比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9), 并且所有黑洞的中心点都在左下角(0,0),右上角(的更多相关文章
- Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到17 了吗?
		2022年1月20日,Spring官方发布了Spring Boot 3.0.0的第一个里程碑版本M1. 下面一起来来看看Spring Boot 3.0.0 M1版本都有哪些重大变化: Java基线从 ... 
- Docker 在转发端口时的这个错误Error starting userland proxy: mkdir /port/tcp:0.0.0.0:3306:tcp:172.17.0.2:3306: input/output error.
		from:https://www.v2ex.com/amp/t/463719 系统环境是 Windows 10 Pro,Docker 版本 18.03.1-ce,电脑开机之后第一次运行 docker ... 
- Spark详解(03)  - Spark3.0.0运行环境安装
		Spark详解(03) - Spark3.0.0运行环境安装 Spark运行模式 Spark常见部署模式: Local模式:在本地部署单个Spark服务 所谓的Local模式,就是不需要其他任何节点资 ... 
- linux下使用localhost和127.0.0.1都不能连接的解决思路
		linux下刚安装了mysql,尝试写了程序连接mysql,出现了只有用本地ip地址才能连接,而127.0.0.1和localhost都不能访问 解决这个问题主要查看3个方向 .hosts中是否有ip ... 
- MySQL 8.0.0 版本发布,亮点都在这了!
		导读 MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司.目前MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度快.总体拥有成本低,尤其是开 ... 
- 记录:mac的浏览器访问任何域名、网址都跳转到本地127.0.0.1或固定网址
		新年上班第一天,刚开机就遇到了个小坑,问题是这样,打开浏览器,输入任何网址都跳转到本地的一个项目,该项目在本地Apache配置下,监听的端口是8888,本机访问的形式是127.0.0.1:8888. ... 
- This Android SDK requires Android Developer Toolkit version 17.0.0 or above.  Current version is 10.0.0.v201102162101-104271.  Please update ADT to the latest version.
		win7/xp 下面安装Android虚拟机,更新SDK后,在Eclipse preference里指向android-sdk-windows时. 出现 : This Android SDK requ ... 
- iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8001 -j DNAT --to-destination 172.17.0.5:8080 ! -i docker0: iptables: No chain/target/match by that name.
		在docker容器上部署项目后,启动docker容器,出现 iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dpor ... 
- mybatis insert update delete返回都是整型 0,1,增,删,改要提交事物
		mybatis insert update delete返回都是整型 0,1, 没有扔 增,删,改要提交事物 
- iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.17.0.2:3306 ! -i docker0: iptables: No chain/target/match by that name
		今天使用docker运行mysql时报错, 执行命令: docker run --restart=always --name mysql5.7 -p 3306:3306 -v /data/mysql/ ... 
随机推荐
- 【Flutter】环境搭建(Windows+Android Studio 3.6.1)
			最近参加的项目需要用到Flutter框架进行iOS/Android双端开发,然而第一步环境搭建的过程就忙活了一整个晚上,直到现在终于有时间静下心来整理一下搭建过程中遇到的困难. 0x00 Flutte ... 
- Repeater 绑定数据如何根据数据列的内容排序
			可指定Repeater的数据源 从数据库查询时直接排序,而后绑定数据这样 
- ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
			目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ... 
- 基于声网 Flutter SDK 实现互动直播
			前言 互动直播是实现很多热门场景的基础,例如直播带货.秀场直播,还有类似抖音的直播 PK等.本文是由声网社区的开发者"小猿"撰写的Flutter基础教程系列中的第二篇,他将带着大家 ... 
- 设计师必备:免费素材管理工具Billfish v3.0更新了!
			Billfish是专门为设计师打造的图片收藏管理工具,可以轻松管理您的各种素材文件.Billfish是一个免费的软件,支持对大量的图片素材进行管理,提供多种快速的检索筛选功能,如颜色,格式,方向, ... 
- Go语言:通过TDD驱动测试开发为同事写的程序优化提速——初次接触并发与channel
			正文: 假如同事已经写了一个 CheckWebsites 的函数检查 URL 列表的状态. package concurrency type WebsiteChecker func(string) b ... 
- 怎么在php7项目中安装event扩展
			今天就跟大家聊聊有关怎么在php7项目中安装event扩展,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获. 安装支持库libevent wget ... 
- Python爬虫基础教程2
			beautifulsoup4介绍/遍历文档树 bs4 > 从html或xml文件中提取的python库 用它来解析爬取回来的xml 安装:pip install beautifulsoup4 p ... 
- 必知必会的 WebSocket 协议
			文章介绍 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它的出现使客户端和服务器之间的数据交换变得更加简单.WebSocket 通常被应用在实时性要求较高的场景,例如赛事数据. ... 
- uniApp安卓离线SDK运行
			一.下载uniapp提供的离线SDK包 下载地址:https://nativesupport.dcloud.net.cn/AppDocs/download/android 版本:2022年09月26日 ... 
