题目连接:
传送门
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 500010;
int n, m, a[N], ans;
int main() {
while(scanf("%d%d", &n, &m) != EOF) {
if(n == -1 && m == -1) break;
//读入n个城市的市民数
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
//处使化左右区间
int l = 0, r = 3000000;
//二分
while(l < r) {
int mid = l + r >> 1;
int need = 0;
//获取我们所需要的箱子的个数
for(int i = 1; i <= n; i++) {
need += max(1, (a[i] + mid - 1) / mid);
}
//判断箱子够不够
if(need <= m) ans = mid, r = mid;
else l = mid + 1;
}
printf("%d\n", ans);
}
return 0;
}
这是道题可以用二分的方法来做
首先确定一下我们要二分一些什么,我们要二分要找的就是在所有箱子中装的最多的箱子的最小值。这是后我们可以这么想这个问题:由于投票箱的容量是无限的,我们可以二分容量,然后判断当前容量下每个城市需要多少个箱子(每个城市的箱子不能少于一个),如果当前容量不足说明我们要增加容量,反之,我们就可以压缩容量,以得到一个更小的值。