Skip to content

02774: 木材加工

http://cs101.openjudge.cn/practice/02774/

木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目是给定了。当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段木头的最大长度。

木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是正整数。

输入

第一行是两个正整数NK(1 ≤ N ≤ 10000, 1 ≤ K ≤ 10000),N是原木的数目,K是需要得到的小段的数目。 接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。

输出

输出能够切割得到的小段的最大长度。如果连1厘米长的小段都切不出来,输出"0"。

样例输入

3 7
232
124
456

样例输出

114

来源

NOIP 2004

可以参考04135: 月度开销,08210: 河中跳房子

python
n, k = map(int, input().split())
expenditure = []
for _ in range(n):
    expenditure.append(int(input()))


def check(x):
    num = 0
    for i in range(n):
        num += expenditure[i] // x

    return num >= k

lo = 1
hi = max(expenditure) + 1

if sum(expenditure) < k:
    print(0)
    exit()

ans = 1
while lo < hi:
    mid = (lo + hi) // 2
    if check(mid):
        ans = mid
        lo = mid + 1
    else:
        hi = mid

print(ans)