PAT(B) 1090 危險品裝箱(Java)

題目連接:1090 危險品裝箱 (25 point(s))java

題目描述

集裝箱運輸貨物時,咱們必須特別當心,不能把不相容的貨物裝在一隻箱子裏。好比氧化劑絕對不能跟易燃液體同箱,不然很容易形成爆炸。web

本題給定一張不相容物品的清單,須要你檢查每一張集裝箱貨品清單,判斷它們是否能裝在同一只箱子裏。數組

輸入格式

輸入第一行給出兩個正整數:N (≤10​4​​) 是成對的不相容物品的對數;M (≤100) 是集裝箱貨品清單的單數。安全

隨後數據分兩大塊給出。第一塊有 N 行,每行給出一對不相容的物品。第二塊有 M 行,每行給出一箱貨物的清單,格式以下:svg

K G[1] G[2] ... G[K]

其中 K (≤1000) 是物品件數,G[i] 是物品的編號。簡單起見,每件物品用一個 5 位數的編號表明。兩個數字之間用空格分隔。spa

輸出格式

對每箱貨物清單,判斷是否能夠安全運輸。若是沒有不相容物品,則在一行中輸出 Yes,不然輸出 Nocode

輸入樣例

6 3
20001 20002
20003 20004
20005 20006
20003 20001
20005 20004
20004 20006
4 00001 20004 00002 20003
5 98823 20002 20003 20006 10010
3 12345 67890 23333

輸出樣例

No
Yes
Yes

Java 代碼

若是最後一組數據超時,多提交幾回就行。xml

/********************************************************************************* Submit Time Status Score Problem Compiler Run Time User 8/30/2019, 20:32:08 Accepted 25 1090 Java (openjdk) 395 ms wowpH *********************************************************************************/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
	// 一、保存不相容的物品,key是物品,list是與key不相容的物品列表
	private Map<String, List<String>> incompatibleItems;

	public Main() {
		// 二、輸入流
		Reader in = new InputStreamReader(System.in);
		BufferedReader input = new BufferedReader(in);

		// 三、獲取物品對數和清單數量
		String[] arr = nextLine(input);
		int logarithmofGoods = Integer.parseInt(arr[0]);
		int numberofListings = Integer.parseInt(arr[1]);

		// 四、建立一個保存不相容物品的哈希映射
		incompatibleItems = new HashMap<String, List<String>>();

		// 五、輸入全部不相容物品,生成不相容物品映射incompatibleItems
		for (int i = 0; i < logarithmofGoods; ++i) {
			arr = nextLine(input);
			addIncompatibleItems(arr[0], arr[1]);
			addIncompatibleItems(arr[1], arr[0]);
		}

		// 七、輸入全部清單,檢查它是否安全,並輸出結果
		for (int i = 0; i < numberofListings; ++i) {
			arr = nextLine(input);
			arr = Arrays.copyOfRange(arr, 1, arr.length);// 1.去掉數組的第一個元素
			Arrays.sort(arr);// 2.將清單物品按照編號排序

			// 3.檢查並輸出是否安全
			if (checkItems(arr)) {
				System.out.println("Yes");
			} else {
				System.out.println("No");
			}
		}
	}

	// 四、讀取一行字符串,轉成字符串數組,返回數組
	private String[] nextLine(BufferedReader input) {
		String[] arr = new String[0];
		try {
			arr = input.readLine().split(" ");
		} catch (IOException e) {
		}
		return arr;
	}

	// 六、將incompatibleItem添加到與item不相容的物品列表
	private void addIncompatibleItems(	String item,
										String incompatibleItem) {
		List<String> list;
		if (incompatibleItems.containsKey(item)) {// 1.包含物品item
			list = incompatibleItems.get(item);// 2.獲取item的不相容物品列表
		} else {// 3.不包含item
			list = new ArrayList<String>();// 4.建立新的列表
		}
		list.add(incompatibleItem);// 5.將incompatibleItem添加到列表中
		incompatibleItems.put(item, list);// 6.保存到映射中
	}

	// 八、檢查清單是否安全
	private boolean checkItems(String[] itemList) {
		for (String item : itemList) {
			if (!incompatibleItems.containsKey(item)) {// 1.當前物品無不相容物品
				continue;// 2.跳過,檢查清單的下一個物品
			}
			// 3.獲取與item不相容的物品列表
			List<String> list = incompatibleItems.get(item);
			// 4.檢查與item不相容的全部物品是否在清單中
			for (String inItem : list) {
				int index = Arrays.binarySearch(itemList, inItem);
				if (index >= 0) {// 5.當前不相容的物品在清單中
					return false;// 6.返回不安全
				}
			}
		}
		return true;// 7.安全
	}

	public static void main(String[] args) {
		new Main();
	}
}

提交結果

在這裏插入圖片描述

相關文章
相關標籤/搜索