摘枇杷

摘枇杷

时间限制: 2000 ms  |  内存限制: 65535 KB
难度: 3
描述

理工学院的枇杷快熟了,ok,大家都懂得。而且大家都知道,学校的枇杷树都是一列一列的。现在小Y同学已经在筹划怎么摘枇杷了。现在我们假设有一列枇杷树,而且每棵枇杷树上枇杷果的数量小Y都已经知道了。

假设现在有n棵枇杷树,小Y可以把这n棵枇杷树分成m组,每组枇杷果的数量是这组内每棵枇杷树上枇杷果数量的和。注意,每组的枇杷树必须是连续的。(每组最少1棵树,最多n棵树)。小Y把枇杷往寝室拿的时候是一组一组拿的,所花费的力气等于这m组中枇杷果最多的那组枇杷果的数量。现在小Y想花尽量少的力气把这些枇杷果拿回寝室。

输入
多组测试数据,以EOF结束(<= 100组)
每组测试数据第一行有两个数n(n <= 1000)和m(1 <=m <= n)
第二行有n个数,分别代表每颗树上枇杷果的数量
输出
输出小Y同学所花费的最小的力气,每个结果占一行。
样例输入
3 2
1 2 3
7 5
1 4 3 1 5 2 4
样例输出
3

5

//暴力二分

#include <stdio.h>

int m, n, num[1001];

int check(int x)    //判断每组容量为x是是否满足要求
{
    int i, cnt, sum;
    for(i = 0, sum = 0, cnt = 1; i < n; i++)
    {
        if(num[i] > x)    //若出现比容量大的说明取小了
        {
            return 0;
        }
        if(sum+num[i] > x)
        {
            cnt++;
            sum = num[i];
            if(cnt > m)
            {
                return 0;
            }
        }
        else
        {
            sum += num[i];
        }
    }
    return 1;    //若正好也返回取大了,避免出现更小的更优解
}

int binarySearch(int min, int max) //二分暴力查找
{
    int left = min, right = max, mid;
    while(left <= right)      //注意这里应该 <= 保证结果尽量小(比较难理解)
    {
        mid = (left+right)/2;
        if(check(mid))
        {
            right = mid-1;
        }
        else
        {
            left = mid+1;
        }
    }
    return left;
}

int main()
{
    int i, sum, tmax;
    while(scanf("%d%d", &n, &m) != EOF)
    {
        tmax = 0;    //两个边界
        sum = 0;
        for(i = 0; i < n; i++)
        {
            scanf("%d", &num[i]);
            sum += num[i];
            if(num[i] > tmax)
            {
                tmax = num[i];
            }
        }
        printf("%d\n", binarySearch(tmax, sum));   //暴力二分搜索
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值