1 / 25

超大鏡框設置

TIOJ1370 解題報告. 超大鏡框設置. 題意概要. 給定一個每段高度不一的鏡框,問最大能擺下面積為多少的鏡子。. 一個比較慢的方法. 枚舉矩形的左右界,再找出其中最低高度。. 依此類推,即得答案。. 但是 ……. 這樣好像有點慢,左右界的對數有 n * (n-1)/2 組,再算上對每一組找最低高度的時間 … 好像有點慢囧 rz. 一個簡單的觀察. 最大的矩形一定頂天立地 ( 四邊都有碰到框框 ) ,否則矩形可以再擴張。. 所以 ……. 我們得到了一個似乎快一點的方法: 對於每個左界,我們只找無法再往右的右界 ( 再往右會造成最低的高度降低 ).

Download Presentation

超大鏡框設置

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. TIOJ1370解題報告 超大鏡框設置

  2. 題意概要 • 給定一個每段高度不一的鏡框,問最大能擺下面積為多少的鏡子。

  3. 一個比較慢的方法 • 枚舉矩形的左右界,再找出其中最低高度。 依此類推,即得答案。

  4. 但是…… • 這樣好像有點慢,左右界的對數有n*(n-1)/2組,再算上對每一組找最低高度的時間… • 好像有點慢囧rz

  5. 一個簡單的觀察 • 最大的矩形一定頂天立地(四邊都有碰到框框),否則矩形可以再擴張。

  6. 所以…… • 我們得到了一個似乎快一點的方法: • 對於每個左界,我們只找無法再往右的右界(再往右會造成最低的高度降低) 對於這個紅色的左界 候選的右界只有一個

  7. 但是…… • 雖然我們盡量將可能的組數降低了,而且不必花費額外的時間查找中間最低的高度,但是仍需要檢查所有的n*(n-1)組組合,以找到適合的組合。 • 好像還是有點慢囧rz

  8. 再一次觀察 • 再讓我們觀察一下,許多的左界似乎擁有相同的右界。 對於這兩條紅色的左界 候選的右界中, 都共同有最右邊的一條右界

  9. 所以…… • 其實對於很多左界,我們是可以不用一一找右界的! • 經由上述觀察,我們得到了一個新方法!

  10. 利用stack的新方法 • 另stack的每個元素中,紀錄水平位置及高度 • 由左到右依序將每一格push進stack中,再加入前不斷pop裡頭的元素,直到新的元素加進去後,高度會在stack中維持遞增。

  11. 利用stack的新方法 • 在pop的同時,以pop出的元素為左界,即將push的元素為右界,且因為原stack中高度為遞增關係,所以高度必為即將pop出的元素代表的高度,每次pop皆檢查以該方式產生的矩形是否會比已知的更大。 • 但需要注意的是,若push前曾經pop過元素,代表在自己以前有元素比自己高,因此左界尚可往左移,push的元素需要更動水平位置。

  12. 利用stack的新方法 目前矩形最大面積: 0 將(1,1)push進stack中 (5,4) (3,3) (2,2) (6,2) (1,1) (4,2) (1,1) (7,0)

  13. 利用stack的新方法 目前矩形最大面積: 0 因為2>=1, 所以將(2,2)push進stack中 (5,4) (3,3) (2,2) (6,2) (4,2) (2,2) (1,1) (7,0)

  14. 利用stack的新方法 目前矩形最大面積: 0 因為3>=2, 所以將(3,3)push進stack中 (5,4) (3,3) (3,3) (6,2) (4,2) (2,2) (1,1) (7,0)

  15. 利用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)

  16. 利用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)

  17. 利用stack的新方法 目前矩形最大面積: 3 因為4>=2, 所以將(5,4)push進stack中 (5,4) (5,4) (3,2) (6,2) (2,2) (1,1) (7,0)

  18. 利用stack的新方法 因為2<4, 所以將(5,4)pop出來 並更新面積 (6-5)*4=4 目前矩形最大面積: 3 4 (5,4) (3,2) (6,2) (2,2) (1,1) (7,0)

  19. 利用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)

  20. 利用stack的新方法 重要:最後要加入最右邊的右界 目前矩形最大面積: 4 因為0>2, 所以將(5,2)pop出來 並更新面積 (7-5)*2=4 (5,2) (3,2) (2,2) (1,1) (7,0)

  21. 利用stack的新方法 重要:最後要加入最右邊的右界 目前矩形最大面積: 4 8 因為0>2, 所以將(3,2)pop出來 並更新面積 (7-3)*2=8 (7,0) (3,2) (2,2) (1,1)

  22. 利用stack的新方法 重要:最後要加入最右邊的右界 目前矩形最大面積: 10 8 因為0>2, 所以將(2,2)pop出來 並更新面積 (7-2)*2=10 (7,0) (2,2) (1,1)

  23. 利用stack的新方法 重要:最後要加入最右邊的右界 目前矩形最大面積: 10 因為0>1, 所以將(1,1)pop出來 並更新面積 (7-1)*1=6 (7,0) (1,1)

  24. 利用stack的新方法 • 利用stackLIFO的性質,我們維護stack內元素的遞增,讓每一個左界(雖然說有可能因為pop的關係左移),都只跟一個右界行成矩形,效率十分的高。

  25. 結語 • 利用stack的性質,我們可以發現很多比一般方法更快更有效率的方法來解決問題。 • 其他例題: • TIOJ1176Cows • 給定一排牛(不是一牛排)每頭牛的高度,牠們只能往右平視或俯視,請問牠們分別能夠看到幾頭牛? (如果兩頭牛的高度一樣,那麼左邊的牛的視野只能看到右邊的牛為止。) • http://tioj.redirectme.net:8080/JudgeOnline/showproblem?problem_id=1176

More Related