poj 3273 Monthly Expense 二分

题目链接:http://poj.org/problem?id=3273

 

因为规定天数连续 所以从前到后贪心即可 裸二分

 

二分专题的特点:

1.很容易写

2.很容易写错

 

所以要注意:

上下界的取值是否太大太小 加起来会不会爆

最后能不能跳出循环

当对中值进行判定以后 应该如何调整lb和ub

 

注意lb那个地方应该赋值为mid+1 否则会T到死

 

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <stack>
#include <set>
#include <queue>
#include <vector>

using namespace std;

typedef long long ll;

const int maxn = 100010;
const double eps = 1e-7;

int a[maxn];


int main()
{
    //freopen("in.txt", "r", stdin);

    int n, m;
    scanf("%d%d", &n, &m);

    int maxnum = 0;
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        maxnum = max(maxnum, a[i]);
    }

    int ub = 0x3fffffff;
    int lb = maxnum;

    while(ub > lb)
    {
        int mid = (ub + lb) / 2;

        int cnt = 0;
        int sum = 0;
        for(int i = 0; i < n; i++)
        {
            if(sum + a[i] > mid)
            {
                cnt++;
                sum = a[i];
                continue;
            }

            sum += a[i];
        }
        cnt++;

        if(cnt <= m)
            ub = mid;
        else
            lb = mid + 1;
    }

    printf("%d\n", ub);

    return 0;
}

 

posted @ 2015-02-24 22:27  地鼠地鼠  阅读(149)  评论(0编辑  收藏  举报