アルゴリズム改善パッキング

リソース制限
メモリ制限: 256.0MB C/C++ 時間制限: 1.0 秒 Java 時間制限: 3.0 秒 Python 時間制限: 5.0 秒
問題の説明
  Lazy には、M 個のパッケージに梱包して M 人に郵送する必要がある N 個のギフトがあります。安いですが、重い。レイジーは、全員が受け取るギフトの番号が連続することを望んでいます。高額な重量超過料金の支払いを避けるために、荷物の最大重量を最小限に抑えたいとも考えていました。
入力形式
  1 行に 2 つの整数 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;//取=表示可能还可以用
	}
}

Supongo que te gusta

Origin blog.csdn.net/qq_54537215/article/details/123935932
Recomendado
Clasificación