分配【东北大学oj数据结构4-4】C语言

题面

你需要从皮带输送机按顺序(i=0,1,…,n−1)得到 n 包wi​ kg的包裹。 你应该将所有包裹装载到 k 辆具有共同最大载荷P 的卡车上。每辆卡车都可以从皮带输送机上装载连续的包裹(大于或等于零),序列中的包裹总重量不得超过最大载荷P。
编写一个程序,读取 n、k和 wi​,并报告最大负载 P 的最小值以装载所有包裹。

输入

在第一行中,两个整数 n 和 k 由空格字符分隔。 在接下来的n行中,分别给出了wi​。

输出

在一行中打印 P 的最小值。

数据范围

1≤n≤100,000
1≤k≤100,000
1≤wi​≤10,000

输入实例

5 3
8
1
7
3
9

输出示例

10 

用二分查找

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int can(int a[],int n,int k,int m)
{
    int c=1;  \\卡车数量
    int temp=0; \\当前卡车上的重量
    for(int i=0;i<n;i++)
    {
        if(a[i]+temp>m)
        {
            c++;
            temp=a[i];
            if(c>k) \\超过卡车数限额
            {
                return 0;
            }
        }
        else
        {
            temp+=a[i];
        }
    }
    return 1;
}
int main()
{
    int n,k;
    scanf("%d %d",&n,&k);
    int w[100000];
    int total=0; \\总重量
    int maxw=0; \\最大重量
    for(int i=0;i<n;i++)
    {
        scanf("%d",&w[i]);
        total+=w[i];
        if(w[i]>maxw)
        {
            maxw=w[i];
        }
    }
    int left=maxw;
    int right=total;
    int result=right;
    int mid;
    while(left<right) \\求结果,结果再最大包裹和总重量之间
    {
        mid=(left+right)/2;
        if(can(w,n,k,mid)==1)
        {
            result=mid;
            right=mid;
        }
        else
        {
            left=mid+1;
        }
    }
    printf("%d\n",result);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值