poj--3273 Monthly Expense(最小化最大值)

来源:互联网 发布:linux grep查找字符串 编辑:程序博客网 时间:2024/05/18 10:25

Monthly Expense

题意

有N个整数构成的数组,将其分成连续的m段区间,使得每段区间之和的最大值最小,求这个最小值。

题解

最小化最大值的问题,即最大值有个下界,不会有比其更小的最大值。
这类问题常使用二分搜索解决。

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int maxn = 100000 + 3;int n, m;int a[maxn];// Complexity: O(nlog(upper - lower))int binarySearch(int lower, int upper){    while(lower <= upper){        int mid = lower + ((upper - lower) >> 1);        int sum = 0, cnt = 1;        for(int i = 0; i < n; ++i){            if(sum + a[i] <= mid) sum += a[i];            else sum = a[i], cnt++;        }//        printf("lower: %d  upper: %d\n", lower, upper);//        printf("mid: %d  cnt: %d\n", mid, cnt);        if(cnt > m) lower = mid + 1;        else upper = mid - 1;    }    return lower;}int main(){#ifdef EXMYfreopen("data.in", "r", stdin);#endif // EXMY    while(scanf("%d %d", &n, &m) != EOF){        int upper = 0, lower = 0;        for(int i = 0; i < n; ++i){            scanf("%d", a + i);            upper += a[i];            lower = max(lower, a[i]);        }        printf("%d\n", binarySearch(lower, upper));    }    return 0;}
0 0
原创粉丝点击