NYOJ(680),摘枇杷,(暴力,或者二分搜索)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=680

很巧妙的一个题目,就是看你的逆向思维,result 一定是max(a[i])~sum中的一个数,然后遍历他,网上说可以二分,感觉完全没有必要,暴力也可,我都写了一下。

#include <stdio.h>

int a[1010];
int n,m;

bool judge(int x)   ///最多搬x,看是否能在m组以内搬完
{
    int s=0,cnt=1;
    for(int i=0;i<n;i++)
    {
        if(s+a[i]>x)
        {
            cnt++;
            s = a[i];
            if(cnt>m)
                return false ;
        }
        else s += a[i];
    }
    return true;
}

int Bin_Search(int _max,int sum)
{
    int l=_max,r=sum;
    while(l<=r)
    {
        int mid = (l+r)/2;
        if(judge(mid))
            r = mid-1;
        else l=mid + 1;
    }
    return l;
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);

        int _max = -1,sum = 0;
        for(int i=0;i<n;i++)
        {
            if(a[i]>_max)
                _max  = a[i];
            sum+=a[i];
        }
        /*int i;
        for(i=_max;i<=sum;i++)
        {
            if(judge(i))
                break;
        }*/
        printf("%d
",Bin_Search(_max,sum));

    }
    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5715693.html