【算法刷题-第3题】分组---蓝桥周赛第1场

题目

蓝桥周赛第一场

题解

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)

你可能感兴趣的:(算法题解,算法)