/* * 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; }