題目連接:1090 危險品裝箱 (25 point(s))java
集裝箱運輸貨物時,咱們必須特別當心,不能把不相容的貨物裝在一隻箱子裏。好比氧化劑絕對不能跟易燃液體同箱,不然很容易形成爆炸。web
本題給定一張不相容物品的清單,須要你檢查每一張集裝箱貨品清單,判斷它們是否能裝在同一只箱子裏。數組
輸入第一行給出兩個正整數:N (≤104) 是成對的不相容物品的對數;M (≤100) 是集裝箱貨品清單的單數。安全
隨後數據分兩大塊給出。第一塊有 N 行,每行給出一對不相容的物品。第二塊有 M 行,每行給出一箱貨物的清單,格式以下:svg
K G[1] G[2] ... G[K]
其中 K (≤1000) 是物品件數,G[i] 是物品的編號。簡單起見,每件物品用一個 5 位數的編號表明。兩個數字之間用空格分隔。spa
對每箱貨物清單,判斷是否能夠安全運輸。若是沒有不相容物品,則在一行中輸出 Yes
,不然輸出 No
。code
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
若是最後一組數據超時,多提交幾回就行。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(); } }