250 likes | 314 Views
TIOJ1370 解題報告. 超大鏡框設置. 題意概要. 給定一個每段高度不一的鏡框,問最大能擺下面積為多少的鏡子。. 一個比較慢的方法. 枚舉矩形的左右界,再找出其中最低高度。. 依此類推,即得答案。. 但是 ……. 這樣好像有點慢,左右界的對數有 n * (n-1)/2 組,再算上對每一組找最低高度的時間 … 好像有點慢囧 rz. 一個簡單的觀察. 最大的矩形一定頂天立地 ( 四邊都有碰到框框 ) ,否則矩形可以再擴張。. 所以 ……. 我們得到了一個似乎快一點的方法: 對於每個左界,我們只找無法再往右的右界 ( 再往右會造成最低的高度降低 ).
E N D
TIOJ1370解題報告 超大鏡框設置
題意概要 • 給定一個每段高度不一的鏡框,問最大能擺下面積為多少的鏡子。
一個比較慢的方法 • 枚舉矩形的左右界,再找出其中最低高度。 依此類推,即得答案。
但是…… • 這樣好像有點慢,左右界的對數有n*(n-1)/2組,再算上對每一組找最低高度的時間… • 好像有點慢囧rz
一個簡單的觀察 • 最大的矩形一定頂天立地(四邊都有碰到框框),否則矩形可以再擴張。
所以…… • 我們得到了一個似乎快一點的方法: • 對於每個左界,我們只找無法再往右的右界(再往右會造成最低的高度降低) 對於這個紅色的左界 候選的右界只有一個
但是…… • 雖然我們盡量將可能的組數降低了,而且不必花費額外的時間查找中間最低的高度,但是仍需要檢查所有的n*(n-1)組組合,以找到適合的組合。 • 好像還是有點慢囧rz
再一次觀察 • 再讓我們觀察一下,許多的左界似乎擁有相同的右界。 對於這兩條紅色的左界 候選的右界中, 都共同有最右邊的一條右界
所以…… • 其實對於很多左界,我們是可以不用一一找右界的! • 經由上述觀察,我們得到了一個新方法!
利用stack的新方法 • 另stack的每個元素中,紀錄水平位置及高度 • 由左到右依序將每一格push進stack中,再加入前不斷pop裡頭的元素,直到新的元素加進去後,高度會在stack中維持遞增。
利用stack的新方法 • 在pop的同時,以pop出的元素為左界,即將push的元素為右界,且因為原stack中高度為遞增關係,所以高度必為即將pop出的元素代表的高度,每次pop皆檢查以該方式產生的矩形是否會比已知的更大。 • 但需要注意的是,若push前曾經pop過元素,代表在自己以前有元素比自己高,因此左界尚可往左移,push的元素需要更動水平位置。
利用stack的新方法 目前矩形最大面積: 0 將(1,1)push進stack中 (5,4) (3,3) (2,2) (6,2) (1,1) (4,2) (1,1) (7,0)
利用stack的新方法 目前矩形最大面積: 0 因為2>=1, 所以將(2,2)push進stack中 (5,4) (3,3) (2,2) (6,2) (4,2) (2,2) (1,1) (7,0)
利用stack的新方法 目前矩形最大面積: 0 因為3>=2, 所以將(3,3)push進stack中 (5,4) (3,3) (3,3) (6,2) (4,2) (2,2) (1,1) (7,0)
利用stack的新方法 因為2<3, 所以將(3,3)pop出來 並更新面積 (4-3)*3=3 目前矩形最大面積: 0 3 (5,4) (3,3) (6,2) (4,2) (2,2) (1,1) (7,0)
利用stack的新方法 因為2>=2, 且上一個stack中pop掉的(3,3) 高於自己,所以將左界改成3 將(3,2)push進stack中 目前矩形最大面積: 3 (4,2) (5,4) (3,2) (6,2) (2,2) (1,1) (7,0)
利用stack的新方法 目前矩形最大面積: 3 因為4>=2, 所以將(5,4)push進stack中 (5,4) (5,4) (3,2) (6,2) (2,2) (1,1) (7,0)
利用stack的新方法 因為2<4, 所以將(5,4)pop出來 並更新面積 (6-5)*4=4 目前矩形最大面積: 3 4 (5,4) (3,2) (6,2) (2,2) (1,1) (7,0)
利用stack的新方法 目前矩形最大面積: 4 因為2>=2, 且上一個stack中pop掉的(5,4) 高於自己,所以將左界改成5 將(5,2)push進stack中 (6,2) (5,2) (3,2) (2,2) (1,1) (7,0)
利用stack的新方法 重要:最後要加入最右邊的右界 目前矩形最大面積: 4 因為0>2, 所以將(5,2)pop出來 並更新面積 (7-5)*2=4 (5,2) (3,2) (2,2) (1,1) (7,0)
利用stack的新方法 重要:最後要加入最右邊的右界 目前矩形最大面積: 4 8 因為0>2, 所以將(3,2)pop出來 並更新面積 (7-3)*2=8 (7,0) (3,2) (2,2) (1,1)
利用stack的新方法 重要:最後要加入最右邊的右界 目前矩形最大面積: 10 8 因為0>2, 所以將(2,2)pop出來 並更新面積 (7-2)*2=10 (7,0) (2,2) (1,1)
利用stack的新方法 重要:最後要加入最右邊的右界 目前矩形最大面積: 10 因為0>1, 所以將(1,1)pop出來 並更新面積 (7-1)*1=6 (7,0) (1,1)
利用stack的新方法 • 利用stackLIFO的性質,我們維護stack內元素的遞增,讓每一個左界(雖然說有可能因為pop的關係左移),都只跟一個右界行成矩形,效率十分的高。
結語 • 利用stack的性質,我們可以發現很多比一般方法更快更有效率的方法來解決問題。 • 其他例題: • TIOJ1176Cows • 給定一排牛(不是一牛排)每頭牛的高度,牠們只能往右平視或俯視,請問牠們分別能夠看到幾頭牛? (如果兩頭牛的高度一樣,那麼左邊的牛的視野只能看到右邊的牛為止。) • http://tioj.redirectme.net:8080/JudgeOnline/showproblem?problem_id=1176