能拿一半,为什么还有wr和tle,感觉没什么问题的
import sys
input = sys.stdin.readline
n, k = map(int,input().split())
wood = []
for _ in range(n):
wood.append(int(input()))
# 首先这道题是二分
# 也就是说,最短的那根木头一定长于等于切出来的最小段,但是怕跑掉数据,先看1000001最大的,万一超时再说
# 那我们就从0到最短的那根木头分别取l,r
# 判定一旦r小于1,那就直接输出0
def check(mid):
global k,wood
pac = 0
for w in wood:
while w >= mid:
w -= mid
pac += 1
# 正好切出最长的最小段,合题意1
if pac == k:
return 1
# 切出最长的最小段比要求的少,也就是说切的长了
elif pac < k:
return 2
# 切出最长的最小段比要求的多,也就是说切的短了
elif pac > k:
return 3
left, right = 0, max(wood)
mid = 0
result = 0
while left <= right:
mid = (left + right) // 2
if right < 1:
result = 0
break
check_result = check(mid)
if check_result == 1:
result = mid
left = mid + 1
elif check_result == 2:
right = mid - 1
else:
left = mid + 1
print(result)