ペンの質問の2020 XiaomanのJava方向

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/Miaoshuowen/article/details/102183918

2番目の質問

:説明タイトル
最大重みWへのブリッジを介して他のN車両、前記i番目の車重W [i]は、ブリッジ[i]は時間tを通過しています。
要件:
i番目の車上のブリッジの時間ブリッジ車両I-1の最初の時間よりも早くない、
任意の時点で全車両の総重量は、ブリッジWを超えません
だから、ブリッジによってすべての車両に必要な最小時間はどのくらいですか?
入力:
入力の最初の2行目の整数N、W(1 <= N 、W <= 100000)。[1]〜W [N] W第二の入力ラインNの整数(1 <= W [i]は<= W)。第3入力ラインNの整数T [1]〜[N](1 <= Tする T [I] <= 10000)。
出力:
出力ブリッジを渡るすべての車両に必要な最小時間を表す整数。
サンプル入力

4 2
1 1 1 1 
2 1 2 2 

出力例:

4

アイデア:
次の車を開始橋、現在の車両重量で車の橋プラスW未満の出発重量の1、の各車両の出発時刻の一種で、最小ヒープを確立する(つまり、ヒープに参加)、いつでもヒープときは車の下に橋の上には、時間を更新します。
ミン・ヒープのプライオリティキューを実装することができます。
拡張:
優先度つきキュー(プライオリティキュー)、無制限に基づく優先ヒーププライオリティキュー。
それは実際にヒープです(デフォルトはコンパレータ最小ヒープが指定されていない)カスタムを渡して、大きなパイルトップコンパレータ機能を介して達成することができます。

PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); //小顶堆,默认容量为11
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(11,new Comparator<Integer>(){ //大顶堆,容量11
    @Override
    public int compare(Integer i1,Integer i2){
        return i2-i1;
    }
});

コード:

import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Duxiaoman2 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner in = new Scanner(System.in);
		int N = in.nextInt();
		int W = in.nextInt();
		int arrw[] = new int[N];
		int arrt[] = new int[N];

		for (int i = 0; i < N; i++) {
			arrw[i] = in.nextInt();
		}
		for (int i = 0; i < N; i++) {
			arrt[i] = in.nextInt();
		}
		Duxiaoman2 test = new Duxiaoman2();
		System.out.println(test.mintime(arrw, arrt, W, N));
	}

	private int mintime(int[] arrw, int[] arrt, int W, int N) {

		PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		int time = 0;
		int w = 0;
		int[] endtime = new int[N];
		int i = 0;
		int j = 0;
		while (j < N) {
			if (i < N && w + arrw[i] <= W) {
				endtime[i] = arrt[i] + time;
				map.put(endtime[i], map.getOrDefault(endtime[i], 0) + arrw[i]);
				w = w + arrw[i];
				minHeap.add(endtime[i]);
				i++;
			} else {

				int emp = minHeap.peek();
				time = minHeap.poll();
				j++;
				while (!minHeap.isEmpty() && emp == minHeap.peek()) {

					minHeap.poll();
					j++;
				}
				w = w - map.get(emp);

			}
		}

		return time;
	}
}

おすすめ

転載: blog.csdn.net/Miaoshuowen/article/details/102183918