Loading

P1182 数列分段`Section II` 二分

https://www.luogu.org/problemnew/show/P1182

做了这个题才知道二分的强大

这个题可以假设我们有n个果子 m个容器 要能把果子全装进去 那么容器最小可以是多小

很显然 如果我们的容器每一个都能把全部的果子装进去 那么一定是一种可行的解 但不是最优的

容器最小是多小呢?至少要能装得下最大的果子

所以答案就在 maxAi 和 sumAi 之间 进行二分查找即可

如果当前的mid是容器的容量,求出来需要多少容器 如果比 m 多 那么说明 mid 太小了 如果小于等于 m 那么就看看还有没有可以更小一点的容量

#include<bits/stdc++.h>

using namespace std;

int n,m,a[100005];

void erfen(int l,int r)
{
    int i;
    if(l>=r)
    {
        cout<<l<<endl;
        exit(0);
    }
    int mid=(r+l)/2;
    int sumn=0;
    int k=1;
    for(i=0;i<n;i++)
    {
        sumn+=a[i];
        if(sumn>mid)
        {
            sumn=a[i];
            k++;
            if(k>m)
            break;
        }
    }
    if(k>m)
    {
        erfen(mid+1,r);
    }
    else
    {
        erfen(l,mid);
    }
    
}


int main()
{
    int i,maxn=0,sumn=0;
    cin>>n>>m;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
        maxn=max(a[i],maxn);
        sumn+=a[i];
    }
    erfen(maxn,sumn);
}

 

posted @ 2019-06-03 09:29  WinterFa1L  阅读(169)  评论(0编辑  收藏  举报