POJ 3273

传说中的二分穷举

题意是:农夫每天有一个花费预算,一个n天,把这n天划分成m组,注意,n天的顺序是不能变的。这道题求得是一个划分依据k,每组的最大花费不能超过k,所以,要通过二分来寻找这个值。

上限high是所有的花费,下限low是所有花费中的最大值。有了上下限,就开始二分,在二分的过程中要判断是否是否能够利用mid值来划分出m组如果划分出来的组数大于m的话,增加mid的值

如果小于或者等于m的话,减小mid的值。

网上大牛的代码:

#include <iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;


int n,m;

bool group(int mid,int money[])
{
    int sum=0;
    int group=1;

    for(int i=0; i<n; i++)
    {
        if(sum+money[i]<=mid)
        {
            sum+=money[i];
        }
        else
        {
            sum=money[i];
            group++;
        }
    }

    if(group>m)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        int *money=new int[n+1];

        int low=0;
        int high=0;

        for(int i=0; i<n; i++)
        {
            scanf("%d",&money[i]);
             
            high+=money[i];
            
            if(low<money[i])
            {
                low=money[i];
            }
        }

        int mid;

        while(low<=high)
        {
            mid=(low+high)/2;
            if(group(mid,money))
            {
                low=mid+1;
            }
            else
            {
                high=mid-1;
            }
        }

        printf("%d
",mid);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/qioalu/p/5152813.html