小明在直线的公路上种树,现在给定可以种树的坑位的数量和位置,以及需要种多少棵树苗,问树苗之间的最小间距是多少时,可以保证种的最均匀(两棵树苗之间的最小间距最大) 输入三行: 第一行一个整数:坑位的数量 第二行以空格分隔的数组:坑位的位置 第三行一个整数:需要种植树苗的数量 输出: 树苗之间的最小间距 输入: 7 1 5 3 6 10 7 13 3 输出: 6 说明:三颗树苗分别种在 1、7、13 的位置,可以保证种的最均匀,树苗之间的最小间距最大为 6。 输入: 11 1 3 6 7 8 11 13 15 16 18 19 4 输出: 6 说明:4颗树苗分别种在1, 7, 13, 19位置,可以保证种的最均匀,树苗之间的最小间距最大为 6。 假设现在种树间距是x,那么如果可以种植成功,那说明[0,x−1]种树间距也可以成功,如果失败,那说明[x+1,Dis]种树间距也会失败。因此,我们可以采用二分算法。 我们定义一个种树间距区间[left,right],每次取得区间的中点mid,然后以间距为mid进行种树,查看是否成功,如果成功,那么搜索范围会变为[mid+1,right],不成功,搜索范围为[[left,mid−1]。
def check_plant_trees(pos, tree_num, dis):
count = 1
cur_pos = pos[0]
plant_pos = [pos[0]]
for i in range(1, len(pos)):
if pos[i] - cur_pos >= dis:
count += 1
cur_pos = pos[i]
plant_pos.append(pos[i])
print(f"plant_pos: {plant_pos}")
if count >= tree_num:
return True
else:
return False
def get_min_dis():
n = int(input())
pos = list(map(int, input().split()))
tree_num = int(input())
sorted(pos)
print(f"pos: {pos}")
success_dis_list = []
left = 0
right = pos[-1] - pos[0]
while left <= right:
mid = (left + right)//2
if check_plant_trees(pos, tree_num, mid):
print("种树成功")
left = mid + 1
success_dis_list.append(mid)
else:
print("种树失败")
right = mid - 1
print(success_dis_list)
return max(success_dis_list)
if __name__ == '__main__':
res = get_min_dis()
print(f"最小植树距离是: {res}")
个人解法,如有错误,欢迎指正,Thanks♪(・ω・)ノ