算法实践:农夫和牛 (二分)

农夫和牛

描述

农夫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()
发布了129 篇原创文章 · 获赞 148 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/matafeiyanll/article/details/104862345