题意:
有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; }