最大化最小值问题(二分法)

二分中非常典型的应用就是“最小化最大值问题”和“最大化最小值问题”,本篇结合三道例题来说明最小化最大值问题;

最大化最小值:

会给你一些可取的数据范围(这个范围有时候需要自己发现,不过一般来说都很明显),然后在这些范围中找到符合要求的数值(通过函数判断),当然一般会有很多值都是符合要求的,用二分找出那个最小的答案(就是符合要求的话就让right=mid,不符合的话就让left=mid啦);

例一:CSU 1976  搬运工小明    题目在这里

最大化最小值问题(二分法)_第1张图片最大化最小值问题(二分法)_第2张图片

是一个模板题……下面结合代码来说明

#include
#include
#include
#define maxn 100005

using namespace std;
long long a[maxn];
int n,m;

bool cal(long long mid)//这个函数就是把每个东西装入袋子的过程,看此时选择的体积是否可以装完
{
    long long vol=0;
    int cnt=0;
    for(int i=0;i=n)
            return false;
        while(volmid) //如果这时候vol>mid,就说明刚刚最后装的那个其实是装不下的,要取出来
        {            //之所以加这个判断是因为有一种情况:刚刚装的那个刚好把袋子装满,此时也会出上面的循环,但物品不用拿出
            i--;
            vol-=a[i];
        }
        cnt++;//袋子数+1
        vol=0;
    }
    return true;
}
int main(void)
{
    int t;
    //int n,m;
    long long sum;
    scanf("%d",&t);
    while(t--)
    {
        sum=0;
        scanf("%d%d",&n,&m);
        for(int i=0;i=left)
        {
            long long mid=(right-left)/2+left;
            if(cal(mid))
            {
                right=mid-1;
            }
            else
            {
                left=mid+1;
            }
        }
        printf("%lld\n",left);
    }
}

呼呼,这个东西今天终于弄明白了(好菜好菜嘤),然后下面有两道题跟这个思路基本一样;

题目一:戳我戳我

  这个是完全一模一样的,把上面的模板套进去几乎不用改就可以

题目二:戳我戳我

  这个思路也是一样的,只是cal()函数做了一些改动,结合题意,奶牛是怎么放置的就可以。

 

呼呼

你可能感兴趣的:(二分,三分)