POJ 3273 (最大组最小值)

来源:互联网 发布:笛卡尔心形线 c语言 编辑:程序博客网 时间:2024/05/17 03:42

题意:

有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;}
0 0
原创粉丝点击