POJ 3273 Monthly Expense

简单的二分题目。第一次做感觉这种思考方法很是新颖。

既然是二分  就肯定要找出  上界 和 下界  然后不断取中间状态 寻找最优解。

此题,上界显然是所有数的和,下界是数据中的最大值。

按照  mid = (low+high)/2  去划分。若 < m  则说明 mid 偏大 否则 偏小。


#include <iostream>
#include <cstdio>

#define LL long long
#define Max(a,b) ( (a) > (b) ? (a) : (b) )
#define Min(a,b) ( (a) < (b) ? (a) : (b) )

using namespace std;

int a[100100];
bool judge(LL value,int n,int m)
{
    int i,group = 1;
    LL sum;
    for(i = 1,sum = 0;i <= n; ++i)
    {
        sum += a[i];
        if(sum > value)
        {
            group++;
            sum = a[i];
        }
    }
    if(group > m)
        return true;
    else
        return false;
}
int main()
{
    int n,m;
    LL mid,high = 0,low = 0;
    scanf("%d %d",&n,&m);
    for(int i = 1;i <= n; ++i)
    {
        scanf("%d",&a[i]);
        low = Max(low,a[i]);
        high += a[i];
    }
    while(low < high)
    {
        mid = (low + high)/2;
        if(judge(mid,n,m))
            low = mid+1;
        else
            high = mid-1;
    }
    mid = (low + high)/2;
    cout<<mid<<endl;
    return 0;
}

你可能感兴趣的:(POJ 3273 Monthly Expense)