对最大人口进行二分.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 500001;
int pops[maxn] ,N, B;
int main(){
while(scanf("%d%d", &N, &B)){
if(N == -1 && B == -1)break;
int L = 0, R = 0, ans = 0;
for(int i = 0; i < N; ++i){
scanf("%d", &pops[i]);
R = max(R, pops[i]);
}
sort(pops, pops + N);
while(L <= R){
int mid = (L + R) / 2;
int b = 0 ;
for(int i = 0; i < N && b <= B; ++i){
if(pops[i] > mid){
b += (int)ceil(pops[i] / (mid + 0.0));//至少两个以上箱子
}else{
b++;//一个箱子
}
}
if(b <= B){
ans = mid;
R = mid - 1;
}else{
L = mid + 1;
}
}
printf("%d\n",ans);
}
return 0;
}