农夫和牛
描述
农夫John建造了一座很长的畜栏,它包括N(2≤N≤100,000)个隔间,这些小隔间的位置为x0,…,xN-1(0≤xi≤1,000,000,000,均为整数,各不相同).
John的C(2≤C≤N)头牛每头分到一个隔间。牛都希望互相离得远点省得互相打扰。
怎样才能使任意两头牛之间的最小距离尽可能的大,这个最大的最小距离是多少呢?
输入
第1行: 两个由空格分隔的整数 N,C
第2…N + 1行:第i + 1行包含整数隔间的位置xi。
输出
第1行:一个整数:最大最小距离
样例
5 3
1
2
8
4
9
3
难度
中等
解法
首先对畜栏的位置进行排序,isok函数判断以distance的距离存放是否能装得下所有的牛,接着是一个二分查找的模板SearchMaxD,对最大距离D进行二分查找, 在[left,right]内用二分法查找“最大最近距离”
left的起始值为0,right的其实值为最后一个减第一个(即最大距离)若D可行,则(left= mid+1)在右侧继续查找,若D不可行,则(right = mid)在左边查找。
代码
N = (int)(input())
C = (int)(input())
cow_stall = []
for i in range(N):
cow_stall.append((int)(input()))
cow_stall.sort()
def isok(distance):
count = 1
tempStall = cow_stall[0]
for i in range(1,N):
if(cow_stall[i]-tempStall>=distance):
count += 1
tempStall = cow_stall[i]
if(count>=C):
return True
else:
return False
def SearchMaxD():
left = 0
right = cow_stall[-1]-cow_stall[0]
while(left<right):
mid = (int)((left+right)/2)
if(isok(mid)):
left = mid+1
else:
right = mid
print(mid)
SearchMaxD()