题目:
传送带一次传来了重量分别为wi(i=0,1,…,n-1)的n个货物。现在要将这些货物装到k辆卡车上。每辆卡车可装载的货物数大于等于0,但货物重量总和不得超过卡车的最大运载量p.所有的卡车的最大运载量p一致.
输入: 第一行输入整数 n和整数k,用空格隔开.接下来n行输入n个整数wi,每个数占1行.
输出: 输出p的最小值,占1行.
限制 1<=n<=100000;1<=k<=100000;1<=wi<=10000
输入示例
5 3
8
1
7
3
9
输出示例
10
注:第1辆卡车装2个货物{8,1},第二辆卡车装2个货物{7,3},第3辆卡车装1个货{9},因此最大运载量的最小值为10
利用二分查找
#include<stdio.h>
#define MAX 100000
typedef long long llong;
int n,k;
llong T[MAX];
int chek(llong p);
int solve();
//k辆最大运载量p的卡车最多能装多少货物
int chek(llong p)
{
int j,s,i=0;
for(j=0;j<k;j++)
{
s=0;
while(s+T[i]<=p)
{
s+=T[i];
i++;
if(i==n) return n;
}
}
return i;
}
//二分查找
int solve()
{
llong left=0,right=100000*10000,mid;
while(right-left>1)
{
mid=(right+left)/2;
llong v=chek(mid);
if(v==n) right=mid;
else left=mid;
}
return right;
}
int main()
{
scanf("%ld %ld",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%ld",&T[i]);
}
llong m;
m=solve();
printf("%ld",m);
return 0;
}