【ACM】ALDS1_4_D Allocation

Allocation

点我前往题目链接

You are given n packages of wi kg from a belt conveyor in order (i=0,1,...n−1). You should load all packages onto k trucks which have the common maximum load P. Each truck can load consecutive packages (more than or equals to zero) from the belt conveyor unless the total weights of the packages in the sequence does not exceed the maximum load P

.

Write a program which reads n

, k and wi, and reports the minimum value of the maximum load P

to load all packages from the belt conveyor.

Input

In the first line, two integers n

and k are given separated by a space character. In the following n lines, wi

are given respectively.

Output

Print the minimum value of P

in a line.

Constraints

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

Sample Input 1

5 3
8
1
7
3
9

Sample Output 1

10

If the first truck loads two packages of {8,1}

, the second truck loads two packages of {7,3} and the third truck loads a package of {9}, then the minimum value of the maximum load P

shall be 10.

 

Sample Input 2

4 2
1
2
2
6

Sample Output 2

6

If the first truck loads three packages of {1,2,2}

and the second truck loads a package of {6}, then the minimum value of the maximum load P shall be 6.

题目大意:

给定n种货物、k辆车、求全部货物所需的最大运载量P的最小值。

解题思路:

编写一个算法来计算k辆以内的卡车总共能装多少货物。然后通过二分搜索来检索P。

AC代码:

#include<bits/stdc++.h>
#define MAXN 100000
using namespace std;

typedef long long ll;
int T[MAXN];
int n,k;

//k辆最大运载量为P的卡车能装多少货物 
int check(ll P)
{
//	cout << "1\n";
	int i=0;
	//k辆卡车 
	for(int j=0;j<k;j++)
	{
		ll s=0;
		//如果能装下、继续当前操作 
		while(s+T[i]<=P)
		{
			s+=T[i];
			i++;	
			if(i==n)
				return n;
		}
	}
	return i;
}

int solve()
{
	ll left=0;
	ll right=MAXN*10000;		//货物最大重量 
	ll mid;
	while(right-left>1)
	{
		ll mid=(left+right)/2;
	//	cout << left << " " << mid << " " << right << endl;
		int v=check(mid);		//mid == 检查mid==P时能装多少货物 
	//	cout << v << endl;
		if(v>=n)
			right=mid;
		else
			left=mid;
	}
	return right;
}

int main()
{
	
	cin >> n >> k;
	for(int i=0;i<n;i++)
		cin >> T[i];
	
	ll ans=solve();
	cout << ans << endl;
	
	return 0;
}

/*
5 3
8 1 7 3 9
*/

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值