资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
Lazy有N个礼物需要打成M个包裹,邮寄给M个人,这些礼物虽然很便宜,但是很重。Lazy希望每个人得到的礼物的编号都是连续的。为了避免支付高昂的超重费,他还希望让包裹的最大重量最小。
输入格式
一行两个整数N和M。
一行N个整数,表示N个礼物的重量。
输出格式
一个整数,表示最小的最大重量。
样例输入
3 2
1 1 2
样例输出
2
数据规模和约定
N, M <= 100,000
重量 <= 1,000
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
int pack=sc.nextInt();
int[] weight=new int[num];
int right=0,left=0;//right为sum总和,left为weight[i]中最大的
for(int i=0;i<num;i++) {
weight[i]=sc.nextInt();
right+=weight[i];
if(weight[i]>left)left=weight[i];
}
int mid=0;//mid是最大重量,包裹在pack内最小(将pack用完)
//在Max(weight[i])与sum之间二分查找mid
while(left<right) {
mid=(left+right)/2;
if(judge(weight,mid,pack)) {
right=mid;
}
else {
left=mid+1;
}
}
System.out.println(left);
}
private static boolean judge(int[]weight,int mid,int pack) {
int W=0;//当前包的总重量
int P=1;//包的总数量
for(int val:weight) {
W+=val;
//如果weight超过了最大重量
if(W>mid) {
W=val;//重新开始打包
P+=1;//包的数量加1
}
}
return P<=pack;//取=表示可能还可以用
}
}