切換
舊版
前往
大廳
主題

ZeroJudge - a513: 最大值 解題心得

Not In My Back Yard | 2019-05-15 23:50:35 | 巴幣 0 | 人氣 167

題目連結:


題目大意:
給定一正整數 T ,代表有 T 組測試資料。每組測試資料第一列給定兩正整數 n 、 m (n ≦ 30, 000,m ≦ 10, 000),代表第二列有 n 個數字,代表一數列的內容;接著並有 m 列的輸入。

接著的每列輸入,給定一正整數。若此數為1,則在同一列給定另一數,將其加進數列之中;若此數為 2 ,則輸出現在數列最大的數並移除它。若數列中沒有任何數,輸出「It's empty!」。

最後,由大到小輸出數列所剩的內容。輸出格式請參見範例輸出。



範例輸入:
2
5 5
1 2 3 4 5
2
1 7
2
2
1 4
3 10
3 2 1
2
2
2
2
1 8
2
2
1 20
2
2


範例輸出:
Case 1:
Max: 5
Max: 7
Max: 4
4 3 2 1
Case 2:
Max: 3
Max: 2
Max: 1
It's empty!
Max: 8
It's empty!
Max: 20
It's empty!
It's empty!


解題思維:
很明顯地,題目的要求可以使用優先佇列(Priority Queue),通常會與名為堆積(Heap)的資料結構混淆。因為堆積時常用來實作優先佇列,然而只要滿足條件即可稱為優先佇列(參見維基的定義)。而此題每次是抓最大值,因此堆積為最大堆積(Max-Heap)。

關於堆積這個資料結構,在本人以前的文章有較為詳細的解說,請參見這裡。當有新數字進來,就是加進堆積裡;當要輸出最大值,即輸出堆積最頂端的元素(也就是陣列第一個元素)。

搞定完 m 列輸入後,就一直移除並輸出頂端的元素直到為空。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作