poj 3273 Monthly Expense(二分搜索)

来源:互联网 发布:网络新媒体的传播特征 编辑:程序博客网 时间:2024/05/29 06:30

初学二分搜索,这个题想到思路了,还是挺好的,不过想的有点复杂了。。。还有二分时的边界也太不好把握了。。。
参考:http://www.hankcs.com/program/cpp/poj-3273-monthly-expense.html

#include <iostream>#include <algorithm>using namespace std;const int MAXN = 100010;int money[MAXN];int n,m,upper,lower;bool C(int d){    int cnt = 1;    int sum = 0;    for(int i = 0; i < n; ++i)    {        sum += money[i];        if(sum > d)        {            cnt++;            sum = money[i];        }    }    //cnt > m,就说明d偏小,要增大下界    if(cnt > m)        return true;    return false;}int main(){    while(cin >> n >> m)    {        upper = 0;        lower = 0;        for(int i = 0; i < n; ++i)        {            cin >> money[i];            upper += money[i];            if(money[i] > lower)                lower = money[i];        }        int lb = lower;        int ub = upper;        while(ub > lb)        {            int mid = (ub+lb)/2;            if(C(mid)) lb = mid+1;            else ub = mid;        }        cout << lb << endl;    }    return 0;}
0 0