題目描述
集裝箱運輸貨物時,我們必須特別小心,不能把不相容的貨物裝在一只箱子里。比如氧化劑絕對不能跟易燃液體同箱,否則很容易造成爆炸。
本題給定一張不相容物品的清單,需要你檢查每一張集裝箱貨品清單,判斷它們是否能裝在同一只箱子里。
輸入格式
輸入第一行給出兩個正整數:N (≤104) 是成對的不相容物品的對數;M (≤100) 是集裝箱貨品清單的單數。
隨后數據分兩大塊給出。第一塊有 N 行,每行給出一對不相容的物品。第二塊有 M 行,每行給出一箱貨物的清單,格式如下:
K G[1] G[2] ... G[K]
其中 K (≤1000) 是物品件數,G[i] 是物品的編號。簡單起見,每件物品用一個 5 位數的編號代表。兩個數字之間用空格分隔。
輸出格式
對每箱貨物清單,判斷是否可以安全運輸。如果沒有不相容物品,則在一行中輸出 Yes
,否則輸出 No
。
輸入樣例
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 代碼
如果最后一組數據超時,多提交幾次就行。
/********************************************************************************* 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 {
// 1、保存不相容的物品,key是物品,list是與key不相容的物品列表
private Map<String, List<String>> incompatibleItems;
public Main() {
// 2、輸入流
Reader in = new InputStreamReader(System.in);
BufferedReader input = new BufferedReader(in);
// 3、獲取物品對數和清單數量
String[] arr = nextLine(input);
int logarithmofGoods = Integer.parseInt(arr[0]);
int numberofListings = Integer.parseInt(arr[1]);
// 4、創建一個保存不相容物品的哈希映射
incompatibleItems = new HashMap<String, List<String>>();
// 5、輸入所有不相容物品,生成不相容物品映射incompatibleItems
for (int i = 0; i < logarithmofGoods; ++i) {
arr = nextLine(input);
addIncompatibleItems(arr[0], arr[1]);
addIncompatibleItems(arr[1], arr[0]);
}
// 7、輸入所有清單,檢查它是否安全,並輸出結果
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");
}
}
}
// 4、讀取一行字符串,轉成字符串數組,返回數組
private String[] nextLine(BufferedReader input) {
String[] arr = new String[0];
try {
arr = input.readLine().split(" ");
} catch (IOException e) {
}
return arr;
}
// 6、將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.保存到映射中
}
// 8、檢查清單是否安全
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();
}
}