疯牛问题的二分贪心算法:
加入二分查找速度快了不少。
这里把r的最大值设置为: int((N[-1] - N[0])/(C-1)) 也就是 最大房间与最小房间的差除以需要放的牛数量减一。因为地一头牛确定放在第一个位置了。
# 贪心部分
def judge(N,C,d):
num = 1
location = N[0]
for i in range(1,len(N)):
if N[i]-location>=d:
num+=1
location = N[i]
if num == C:
# print("牛放完了")
return True
return False
# 二分部分
def farmer_cattle2(N,C):
N.sort()
# d = int((N[-1] - N[0])/C)
l = 1
r = int((N[-1] - N[0])/(C-1))
print(l,r)
max = 0
while l<=r:
distance = int((l+r)/2)
# TRUE 表示 牛在右边
if judge(N,C,distance):
l = int(distance)+1
if max <distance:
max = distance
# 表示牛在左边
else:
r = int(distance)-1
print(max)
if __name__ == "__main__":
n_l = [1,2,8,4,9]
cattle_list = [1,5,8]
c = 3
farmer_cattle2(cattle_list, c)