【算法刷题-第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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云辰星.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值