/*
 * 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;
}
posted on 2010-05-22 20:48  梦涵  阅读(747)  评论(0编辑  收藏  举报