演算法 與 資料結構 Algorithm and Data Structure
- Greedy 貪婪法
Greedy
哈哈!這無疑是最符合人性的演算法了!您一定也認為對於短視近利的人類,貪婪而無腦的 選取當下看起來最佳的情況是非常容易的吧!如果你那麼想,那可就錯了XD!正確的貪婪 法的確能讓我們減少不少coding的複雜度,通常也能是時間複雜度大幅提升,但greedy其 實是一個很嚴謹有時候甚至是很不容易發現的,一般都要嚴密的證明他的正確性才能用的安 心而無後遺症!(approximation algorithm則是例外,只要有不錯的bound即可)
刺激的題目啊 XD
當然……也不能把所有題目都列出來,否則之後看到就沒樂趣啦!
所以如有缺漏……我可沒有要說盡請見諒,我要說那一定是我故意的XDrz!
題目一 – 工作排程Job Scheduling I
給定n個工作,以及每個工作開始與結束的時間,一台機器同時只能執行一個工作。問在一 台機器上,最多能執行的工作友幾個?是哪幾個?
題目二 – 工作排程Job Scheduling II
給定n個工作,以及每個工作的截止期限和超時的處罰。在每個工作需要1單位時間的情形 下,問至少會得到多少處罰?以及如何做才能得到最少的處罰?
題目三 – 工作排程Job Scheduling III (NPSC2005決賽, 誰先晚餐) (TIOJ 1072)
有n個人要吃晚餐,當然大家可以同時一起吃,但廚師一次只能做一道菜。給定每個人要吃 的菜需要做多久,以及那個人需要吃多久,試問至少要多少時間,才能讓全部人都吃完?
題目四 – 工作排程Job Scheduling IV (ACM 11269, Setting Problems)
有n個工作,每個工作分為兩部分,必須前一部分執行完畢才能進行後一部分,而機器只有 兩台,一台負責進行前段的工作,另一台負責進行後段的工作。給定每個工作的前段以及後 段分別需要花費的時間,試問最少需要多少時間才能執行完所有工作?
題目五 – 分數背包Fractional Knapsack
有n樣物品,每個物品有其價值和重量。現在你要用一個最多可以裝載重量w的背包裝這些 物品,物品可以切割,試問最多可以裝多少價值的東西?
題目六 – 對對碰 (89年全國賽)
已知每台登山纜車可坐2個人。現有n個人要搭乘纜車上山,給定n個人的體重,為了安全 起見,求一種配法讓纜車承受的最大重量越小越好。
題目七 – 寵物雞 (2005 TOI初選)
給定n種食物的熱量以及保存期限。每1單位時間能餵食1樣食物,每單位熱量可以讓電子
建中資訊培訓講義 (七) - by kelvin
寵物雞增加1公斤體重,而不可以餵食超過保存期限的食物。如果有1單位時間沒有餵食,
則體重減1公斤。問在時間t結束後,電子寵物雞最大可能體重為多少?
題目八– Barn Repair (USACO section 1.3)
有n個牛欄,其中某些牛欄內有牛。現在希望用若干塊連續的木板,把有牛的牛欄封起來,
但礙於現有材料,只能用m塊木板,但每塊的長度可以是任意長。現在的問題是,給定n, m 以及哪些牛欄中有牛,試問需要使用的木板總長最少為多少?
題目九 – 哈夫曼碼Huffman Code
考慮壓縮一個純文字檔案。壓縮方法是將每個字元用一串0和1組成的binary code代替,但 任何一代表字母的binary code,不能是另外一個binary code的prefix。(否則無從區分)
假設知道一個檔案每個字元出現的次數,請設計一個對應方法取代每個字元,讓壓縮後的檔 案長度最短。
Example:
字元/出現次數 ‘a’/5 ‘b’/3 ‘c’/4 ‘d’/9 ‘e’/6 原本二進位碼 1100001 1100010 1100011 1100100 1100101 其中一種最佳的對應方法:
新的二進位碼 10 000 001 01 11 這麼做的檔案長度是2*5 + 3*3 + 3*4 + 2*9 + 2*6 = 61 bits。
大魔王出來了!
以上是一些比較基本的題目或一些經典題型(還有一些雜魚XD),接下來……讓我們來看 一點真正威力十足,而且美麗無比的greedy吧!(一樣,這邊略去了一些我覺得很棒的題目,
因為這些題目非要自己碰到,想了很久,然後豁然開朗地發現它是greedy才美妙啊!)
題目一 – 搭帳棚問題 (2007 TOI二階模擬考)
有n個攤位排成一條線由左至右,每個攤位有各自的寬度。現在預計要做p個相同寬度的帳 篷,除了遮蔽的攤位總寬度不能超過帳棚寬度外,每個帳篷最多只能覆蓋q個連續的攤位,
並且每一個攤位必須都只被一個帳篷覆蓋(不能橫跨兩個帳棚)。
給定每個攤位的寬度,求這p個帳篷的最小寬度。
題目二 – Enlightened Landscape (CEOI 2000, Enlightened Landscape)
在一個山稜線上架設了一條線,我們希望在上面放置若干個燈泡,使 得山稜線上的每一點都能被照亮。
如圖,給定山峰折線的n個頂點 (xi, xi),以及線路高度t。試以儘量少 的燈泡(如左圖中的B1,B2)照亮整個山巒。
建中資訊培訓講義 (七) - by kelvin
題目三 – Mirror (BOI 2001, Mirror)
在一個m*n的盒子裡(高度不重要),每一格(總共m*n格)都可
以放一個45的鏡子。在盒子邊上,每行每列的兩端,都有一個小孔
(共2m+2n個),可以讓光線射入及射出。
現在希望從第i個孔射入的光線從第 Xi個孔射出(必定可以達 成),給定X1~Xn,問鏡子該如何擺設,才能滿足要求?
總之,這就是greedy啦!greedy其實可以是很有趣又不容易的啊,相信大家能夠體會XD!
[完]
建中資訊培訓講義 (七) - by kelvin