题目
题解
1. 这种题型可以使用二分搜极值来做
2. 首先枚举出mid值(二分值),然后去把这个值当做二分值去尝试看是否可以
3. 首先排序,为什么要排序呢,因为这样可以让所有值尽可能的集中,这样极差会小一点
4. 我们要分成k组,每一组尽可能的多,因为单个数的分组极值为0,如果当前组的极差比mid大了,我们就将之前的分为一组,然后不断分组。
5. 通过这样去计算一个cnt值,这个值就是我们分的组,如果最后这个组数比给定的组数大,此时,我们就应该更新我们的mid,且更新l的值,往大的走,因为极值小了,分的组太多了,肯定是不成立的
6. 然后不断二分极值,最后就可以得出最小的那个极值
代码
n,k = map(int,input().split())
a = list(map(int,input().split()))
a.sort()
def check(mid):
last = -1e9 # 这个地方定义这个数的原因是,从第一个元素进来的时候,就应该分了一个组,防止后面少算
cnt = 0
for i in range(len(a)):
if a[i]-last > mid: # 判断极差
last = a[i]
cnt +=1
return cnt <= k
l = 0
r = 1e9 + 10
res = 0
# 开始二分
while l<=r:
mid = int((l+r)/2) # 极值
if check(mid):
r = mid-1
res = mid # 答案
else:
l = mid+1
print(res)