危險品裝箱問題

2021-10-04 17:56:25 字數 1614 閱讀 1527

題目如下:

貨櫃運輸貨物時,我們必須特別小心,不能把不相容的貨物裝在乙隻箱子裡。比如氧化劑絕對不能跟易燃液體同箱,否則很容易造成**。

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

輸入格式:

輸入第一行給出兩個正整數:n (≤10^4) 是成對的不相容物品的對數;m (≤100) 是貨櫃貨品清單的單數。

隨後資料分兩大塊給出。第一塊有 n 行,每行給出一對不相容的物品。第二塊有 m 行,每行給出一箱貨物的清單,格式如下:

k g[1] g[2] … g[k]

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

輸出格式:

對每箱貨物清單,判斷是否可以安全運輸。如果沒有不相容物品,則在一行中輸出 yes,否則輸出 no。

輸入樣例:

6 320001 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

輸出樣例:

noyes

yes分析這道題一開始覺得不好做,但是仔細想一下,用了二十分鐘就寫出來了。

這道題有兩種方案。

第一種方案:

因為每個物品會和多個不相同物體組成一對,所以要給每個物品儲存乙個列表,即與它不相容的物品的列表,然後對列車上的每個物品,同時判斷與它不相同的物品是不是也在列車上。

這時候就可以開乙個二維的動態陣列或者鍊錶,陣列的第一行表示第乙個物品的不相容物品列表,第二行表示第二個物品的不相容物品列表,依次類推。

之後再開乙個一維陣列,用來標記一輛貨車上的所有物品,如果該物品存在,則標記1,不存在則標記0。

之後就是遍歷每乙個物品,同時查二維陣列了。比如說列車上的第乙個物品編號為5,那麼我們就查二維陣列第5行中所有的不相容物品在上面那個一維陣列上是不是為1,如果有任何乙個為1,那麼這輛貨車就不能發車,依次類推遍歷列車上的所有物品。

第二種方案:

我用的是第二種方案解的這道題,我以每乙個不相容物品對作為下標,去存不相容物品隊的某乙個物品。比如說對某乙個不相容物品對,它們編號的和是唯一的。如物品隊20003 20004,我們可以令pairlist[40007] = 20003。這樣依次的去存每乙個物品對,同時,這個陣列初始化為0。

然後對於列車上的物品,遍歷每乙個物品對,如果列車上物品的兩兩組合之和在上面的陣列中為0,說明他們不是乙個不相容物品隊,可以存在於列車之上,但如果兩兩之和等於上面的值,那麼說明存在這個物品對不相容,那麼就不能讓列車發車。因為物品對總是唯一的。

總結一下兩種方案:

第一種方案,假設每個物品的不相同物品列表平均長度為l,列車平均載貨量為m,那麼對每一輛列車,時間複雜度為lm。因為每乙個貨物都要查一查。開的空間為l*100000+10000。

第二種方案,物品對數為m*(m-1)/2,即時間複雜度也是一樣,不過最大也就50000的計算量吧,而空間複雜度因為存的是物品對,所以要200000的空間。

1090 危險品裝箱

includeusing namespace std int main while m 物品的編號乙個5位數的編號代表 cin cnt vectorv cnt 存放這個清單的所有物品編號 for int i 0 i v i a v i 1 標記物品編號對應的位置為1,表示存在在當前清單中 for i...

PAT乙級 危險品裝箱

貨櫃運輸貨物時,我們必須特別小心,不能把不相容的貨物裝在乙隻箱子裡。比如氧化劑絕對不能跟易燃液體同箱,否則很容易造成 本題給定一張不相容物品的清單,需要你檢查每一張貨櫃貨品清單,判斷它們是否能裝在同一只箱子裡。輸入第一行給出兩個正整數 n 10 4 是成對的不相容物品的對數 m 100 是貨櫃貨品清...

PAT 1090 危險品裝箱

貨櫃運輸貨物時,我們必須特別小心,不能把不相容的貨物裝在乙隻箱子裡。比如氧化劑絕對不能跟易燃液體同箱,否則很容易造成 本題給定一張不相容物品的清單,需要你檢查每一張貨櫃貨品清單,判斷它們是否能裝在同一只箱子裡。輸入格式 輸入第一行給出兩個正整數 n 10 4 104 是成對的不相容物品的對數 m 1...