题意:
有n个花费,现在要分成m组,要求分好后的最大的一组的和尽可能的小。
思路:
看到所求的问题肯定都会转不过来弯,其实想一想也很容易想到,m组是一定
要分的,分完之后肯定有一个组的和是最大值,现在我们就二分这个值。
两个注意点
- 上下界的问题,可以再输入的过程之中直接得到。
- 判断mid是否可行的思路是找到当前的a[i]是否属于这个组,有个小于的条件,值得学习。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 100005;
int n,m;
int a[MAXN];
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
__int64 L = 0,R = 0;
for(int i = 1;i <= n; i++) {
scanf("%d",&a[i]);
R += a[i];
if(a[i] > L)
L = a[i];
}
while(L <= R) {
__int64 mid = (L+R) >> 1;
__int64 sum = 0;
int num = 1;
for(int i = 1;i <= n; i++) {
if(sum + a[i] <= mid) {
sum += a[i];
}
else {
sum = a[i];
num ++;
}
}
if(num > m)
L = mid + 1;
else
R = mid - 1;
}
printf("%I64d\n",L);
return 0;
}