POJ 3273 Monthly Expense

来源:互联网 发布:动易cms如何升级 编辑:程序博客网 时间:2024/05/20 00:10


http://poj.org/problem?id=3273

将数列中的元素分组 使得分组后和的最大值最小 采用二分答案的方法穷举。

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;int N,M,a[100010],ans;bool check(int mid){    int sum = 0,cnt = 1;    for(int i=1; i<=N; i++){        if(sum + a[i] <= mid)            sum += a[i];        else{            sum = a[i];            cnt++;        }    }    return cnt <= M;}int main(){//    freopen("in.txt", "r", stdin);    scanf("%d%d",&N,&M);    int sum = 0,left = 0, right;    for(int i=1; i<=N; i++){        scanf("%d",&a[i]);        sum += a[i];        left = max(left, a[i]);    }    right = sum;    while(left <= right){        int mid = (left + right) >> 1;        if(check(mid)){            ans = mid;            right = mid - 1;        }        else            left = mid + 1;    }    printf("%d\n",ans);}

0 0