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日 ...