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
*/