最佳植树距离

2023-10-27 23:04
文章标签 最佳 距离 植树

本文主要是介绍最佳植树距离,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

给定n个坐标点位置,这些位置可以植树,有m棵树,求把m棵树都种下并且相邻树尽可能距离远时,相邻的树的距离的最小值。

输入

第一行n代表有n个坐标
第二行有n个数,用空格隔开,代表n个坐标
第三行m代表m棵树

输出

一个数,代表相邻的树的距离的最小值

思路

  1. 相邻树的距离的取值范围是【1,pos[n-1]】
  2. 题目的解就在这个范围里面,朴素的办法,从pos[n-1]一直往1的方向尝试,当有符合条件的就停止,当下的值就是解。更快的方法是用二分法来确定这个值。朴素的办法可能会超时,没试过。
  3. 如果用朴素的办法,check 函数是要求出当相邻两棵树的距离是大于等于dist时能否种得下大于等于m棵树。二分法的的check 函数也是这样设计。dist 是当下枚举到的相邻两棵树的距离。check 前先对pos 按从小到大排序会更好处理。

代码

二分法版本

import sys n,m = None, None
pos = None # lst
cnt = 0
ans = None
for line in sys.stdin:a = line.split()if cnt == 0:n = int(a[0])elif cnt == 1:pos = aelif cnt == 2:m = int(a[0])breakcnt += 1
pos = [int(e) for e in pos]
pos = sorted(pos)
# left, right = pos[0], pos[n-1] # 这不对
left, right = 1, pos[n-1]-pos[0] # left right 决定解的范围,解的范围是[1, pos[n-1]-pos[0]]
mid = (left+right) >> 1
dis = mid 
cur_idx = pos[0]
def check(dis, pos, n, m):cnt = 1cur_idx = pos[0]for i in range(1, n):if pos[i]- cur_idx >= dis:cnt += 1cur_idx = pos[i]if cnt >= m:return True else:return Falsewhile left <= right:if check(dis, pos, n, m):# dis 是可能的解ans = dis# dis 太小left = mid + 1else:# dis 不是可能的解# dis 太大right = mid -1mid = (left+right) >> 1dis = mid print(ans)

同类型题目

LeetCode 1552 两球之间的磁力

这篇关于最佳植树距离的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/289024

相关文章

Java 中 Optional 的用法及最佳实践

《Java中Optional的用法及最佳实践》在Java开发中,空指针异常(NullPointerException)是开发者最常遇到的问题之一,本篇文章将详细讲解Optional的用法、常用方... 目录前言1. 什么是 Optional?主要特性:2. Optional 的基本用法2.1 创建 Opti

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Java 单元测试之Mockito 模拟静态方法与私有方法最佳实践

《Java单元测试之Mockito模拟静态方法与私有方法最佳实践》本文将深入探讨如何使用Mockito来模拟静态方法和私有方法,结合大量实战代码示例,带你突破传统单元测试的边界,写出更彻底、更独立... 目录Mockito 简介:为什么选择它?环境准备模拟静态方法:打破“不可变”的枷锁传统困境解法一:使用M

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略