题目链接: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\n",Bin_Search(_max,sum));

    }
    return 0;
}

 

相关文章:

  • 2022-01-02
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
  • 2021-09-19
  • 2022-02-22
  • 2021-11-09
猜你喜欢
  • 2022-12-23
  • 2021-08-31
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案