蓝桥杯-倒水

二分答案


n, k = map(int, input().split())
a = list(map(int, input().split()))

def check(mid):
    b = a[:]
    # 从前往后,贪心地倒水
    for i in range(n - k):
        if b[i] > mid:
            # 把多余的倒给后面同色的瓶子
            b[i + k] += b[i] - mid
            b[i] = mid
    # 检查所有瓶子是否都 >= mid
    return min(b) < mid

lo, hi = 1, max(a) + 1
while lo < hi:
    i = (lo + hi) >> 1
    if check(i):
        hi = i
    else:
        lo = i + 1

print(lo - 1)

这是一个二分答案题目,可使用二分答案模板来进行解答(蓝桥杯Python目前不支持往bisect添加check函数检查)


# lo: 左边界 hi: 右边界
# 等价于 bisect_right 查找右边第一个大于target的下标(左闭右开)
while lo < hi:
    i = (lo + hi) >> 1
    if check(i):
        hi = i
    else:
        lo = i + 1