二分简单入门

参考文章:

https://www.cnblogs.com/kkrisen/p/3196470.html

https://www.cnblogs.com/Sunnie69/p/5423817.html


分析


二分.

1.最大化最小值:

相当于n个东西分给m个人,使得每个人至少拿x个,那么每个人拿够了就走,给后面的人多留一点,只要能分够>=m个人就是true,多的全扔给最后一个人就是了.

2.最小化最大值:

相当于n个东西分给m个人,每个人至多能拿x个,那么每个人尽可能多拿一点,给后面的人少留一点,只要能使<=m个人分完这n个东西就是true,之后每个人随便拿一点给没有拿到的人就是了.


总结一下最大值最小化的思路
其实觉得这种算法蛮有现实意义的,给一堆乱七八糟的东西分堆,分出来的每堆都不超过一个固定的数值,这是要有技术含量的。
1.即首先求出二分的上下限,这个是每次二分必做的准备工作,上限即为这一堆东西的总量,下限即单个最大的物品的值。
2.有上下限之后即开始二分,最难写的部分就出来了,即判断当前分堆是否合理,在判断分堆是否合理中,主要的限制因素为两个,一个是单堆的量肯定不能超过当前的Mid值,另一个是分出的堆数一定不能超过题目要求的M值
3.由判断条件即可将二分范围进行缩小,即,一旦当前Mid值满足分堆要求,意味着我还可以把Mid值缩小,即把二分的right=mid,如果当前Mid值触犯了判断条件,即说明当前值还太小,即把left=mid+1。
4.由以上二分return出来的结果即为所求值


#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
#define MAX 100000+5
int num[MAX],n,m;
bool judge(LL mid)
{
    LL sum=0,times=0;
    for(int i=1;i<=n;i++)
    {
        if(num[i]>mid ) return false;
        if(sum+num[i]>mid){
            if(times>=m-1) return false; ///因为接下来最少还需2次,那么times=m-1+2=m+1>m,所以肯定得返回了
            times++;
            sum=num[i];continue;
        }
        sum+=num[i];
    }
    return true;
}
LL binary(LL maxs,LL sum)
{
    LL left=maxs,right=sum,mid;
    while(left<right)
    {
        mid=left+(right-left)/2;

        if(!judge(mid)) left=mid+1;///表示此时的mid不符合条件,那么只能在[mid+1,right]中看能不能找到符合条件的
        else  right=mid; ///表示此时mid符合条件,然后再在[left,mid]中看能不能找到更小的
//        printf("left=%lld\n",left);
    }
    return left;///这里解释下为什么返回left,假设值mid1就是最终的标准答案,但函数会接着在[left,mid1]中看能不能找到更小的值,
                ///因为我们知道值mid1是最终的答案,所以一直会找不到,相应的left会一直逼近于mid1,最终left==mid1,
                ///所以输出left,也可以输出right,随你啦,开心就好

}
int main()
{
    LL sum,left,right,mid,times;
    int maxs;
    while(~scanf("%lld%lld",&n,&m))
    {
        sum=maxs=0;
        for(int i=1;i<=n;i++){
        scanf("%d",&num[i]);
        sum+=num[i];    ///找上限
        maxs=max(maxs,num[i]); ///找下限
        }

    printf("%lld\n",binary(maxs,sum));
    }
    return 0;

}

我的标签:做个有情怀的程序员。

猜你喜欢

转载自blog.csdn.net/ljd201724114126/article/details/80157517
今日推荐