OD 算法题 B卷 【最佳植树距离】

文章目录

最佳植树距离

  • 在直线的公路上种树,给定坑位数量和位置,及需要种多少棵树苗;
  • 树苗之间的最小距离是多少时,可以保证种的最均匀(树苗之间的最小距离最大);

输入描述:
第一行坑位数量;
第二行坑位的位置;
第三行需要种植树苗的数量;
输出描述:
树苗之间的最小距离

示例1:
输入:
7
1 3 6 7 8 11 13
3
输出:
6

示例2:
输入:
8
1 3 6 7 8 11 16 13
4

输出:
5



import bisect

# 输入数据
n = int(input())
pos_list = [int(x) for x in input().split(" ")]
m = int(input())


def count(num):
    """ 统计以num为间距,在有效位置内可以种植的树的棵数 """
    global pos_list
    # 起始位置
    stack = [pos_list[0]]
    # 植树的棵数
    cnt = 1

    # 循环计算
    while True:
        # 在有序列表中插入一个值,并保证有序
        # 返回(相等值的)最右边插入位置的索引
        index = bisect.bisect(pos_list, stack.pop() + num)
        
        if index == len(pos_list):
            # 
            break
        stack.append(pos_list[index])
        cnt += 1
    return cnt


def solve():
    global pos_list, m
    # 升序排序    
    pos_list.sort()
    
    # 间距的最小值与最大值
    left, right = 1, pos_list[-1] // (m-1)
    while left < right:
        # 取中间的间距值
        mid = (left + right) // 2

        if count(mid) >= m:
            # 按照当前的间距种植的树多于m, 则表示间距过小
            left = mid + 1
        else:
            right = mid
    
    return left
 

print(solve())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值