1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| # n, k = map(int, input().split()) # # n, k = 10, 3 # arr = [False] * (n + 1) # # for i in range(k): # arr[int(input())] = True # # # # for i in [5, 2, 10]: # # arr[i] = True # # # def check(d): # i = 1 # while i <= n: # # print(d, i, i + d, arr[i:i + d]) # if not any(arr[i:i + d]): # return False # i += d # return True # # # l, r = 1, n # while l < r: # mid = (l + r) // 2 # print(l, r, mid) # if check(mid): # r = mid # else: # l = mid + 1 # print((l - 1) * 2)
n, k = map(int, input().split()) a = [0] for i in range(k): a.append(int(input())) a.sort()
print(a)
def check(d): len = 0 # 覆盖长度,从最左端开始一直到最右端 for i in range(1, k + 1): if len + d >= a[i]: # 当前覆盖长度加上d之后,是否包括了a[i] if len > a[i]: # 当前覆盖长度是否已经包括了a[i] # 如果当前覆盖长度已经包括了,说明a[i]之前的机器人已经负责了到len这块的区域 # 那a[i]就可以负责len往后再加d的部分 len = a[i] + d - 1 # 减1是因为还要算上自己 else: # 如果当前覆盖长度没有包括a[i],那就让a[i]负责[len+1,len+d] len += d else: return False return len >= n
l, r = 1, n mid = 0 while l < r: mid = (l + r) // 2 print(l, r, mid) if check(mid): r = mid else: l = mid + 1 print((l - 1) * 2)
|