/*
* test1.cpp
*
* Created on: 2010-4-8
* Author: zhanghan
*/
#include <iostream>
using namespace std;
//这道题的思路就是用二分查找,在进行二分查找的时候可以用一点小技巧,就是每次把一个界增加1或者减少1,可以便面某些边界条件的判断
int len[10001]={};
int n,k;
int input()
{
cin>>n>>k;
int max=0;
for(int i=0;i<n;++i)
{
cin>>len[i];
if(len[i]>max)
max=len[i];
}
return max;
}
int solve(int max)
{
int l = 1;
int r = max;
while(l<=r)//只有当l>r的时候才会跳出循环
{
int mid = (l+r)/2;
int sum = 0;
for(int i=0;i<n;++i){
sum+=len[i]/mid;
}
if(sum<k) r = mid-1;//说明需要的长度比mid小,然后把新的右边界定位mid-1
else if(sum>=k) l = mid+1;//说明需要的长度不少于mid,然后把新的左边界定位mid+1
}
return r;//最后的结果
}
int main()
{
int p=input();
cout<<solve(p)<<endl;
return 0;
}