著名的acm(advanced computer maker)公司租用了一層有400個房間的辦公室,結構如表1所示。
表1 acm公司辦公樓室示意圖
房間1
房間3
房間5
…
房間397
房間399
走廊
房間2
房間4
房間6
…
房間398
房間400
¢這層樓沿著走廊南北向的兩邊各有200個房間。最近,公司要做一次裝修,需要在各個辦公室之間搬運辦公桌。
¢由於走廊狹窄,辦公桌都很大,走廊裡一次只能通過一張辦公桌。必須制定計畫提高搬運效率。
¢經理制定如下計畫:一張辦公桌從乙個房間移到另乙個房間最多用十分鐘。當從房間i移動一張辦公桌到房間j,兩個辦公室之間的走廊都會被占用。所以,每10分鐘內,只要不是同一段走廊,都可以在房間之間移動辦公桌;如表2所示。
表2辦公桌移動的狀態
移動辦公桌
理由可行的
(房間30到50)和
(房間60到90)
走廊不重疊
(房間11到12)和
(房間14到13)
走廊不重疊
不可行的
(房間20到40)和
(房間31到80)
房間31到房間40的走廊重疊
(房間1到4)和
(房間3到6)
房間3前面的走廊重疊
(房間2到8)和
(房間7到10)
房間7前面的走廊重疊
每個房間,只有一張辦公桌進出。現在,經理想找到一種方案,使移動桌子的事情盡快完成。請編寫程式解決經理的難題。
input:
輸入資料有t組測試例,在第一行給出測試例個數(t)。每個測試例的第一行是乙個整數n(1≤n≤200),表示要搬運辦公桌的次數。接下來n行,每行兩個正整數s和t,表示一張桌子,是從房間號碼s移到房間號碼t。有多組輸入資料,輸入第一行為乙個表示輸入資料總數的整數n,然後是n組輸入資料。
ouput:
每組輸入都有一行的輸出資料,為一整數t,表示完成任務所花費的最少時間。
sample input:3
410 20
30 40
50 60
70 80
21 3
2 200
310 100
20 80
30 50
sample output:10
2030
該題屬於貪心演算法,因為它盡可能使搬運辦公桌同時進行,以便使單獨安排的搬運次數最少。這樣用的時間最少,即所用最少時間為不能同時搬運桌子的次數,即某一段走廊使用次數最多(貪心標準)即為即為最少搬運時間。
我的做法是把每一次移動辦公桌的起始終點房間看成乙個區間左右界限,類似於區間貪心,將第乙個區間資料作為第乙個移動的始末房間(看成區間),接著遍歷每乙個始末房間(類似於區間),如果當前的區間左界限大於上乙個的區間的右界限,則表明當前的區間和上乙個區間可以同時移動,共用同一時間,把該區間標記為不浪費時間,然後改變上乙個區間的右界限將之設定為當前區間的右界限,接著遍歷剩下的區間。
最後統計不能同時移動的區間(因為能同時移動的區間都已標記成了不浪費時間了)就是單獨安排的搬運次數最少,也是最少搬運時間。
#include#includetypedef struct qujianq;
int main()
}} for(i=0;iprintf("%d\n",cnt);
}return 0;
}
搬水果 貪心演算法實現
1 題目描述 在乙個果園裡,小明已經將所有的水果打了下來,並按水果的不同種類分成了若干堆,小明決定把所有的水果合成一堆。每一次合併,小明可以把兩堆水果合併到一起,消耗的體力等於兩堆水果的重量之和。當然經過 n 1 次合併之後,就變成一堆了。小明在合併水果時總共消耗的體力等於每次合併所耗體力之和。假定...
經典貪心演算法 貪心演算法概述
貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...
演算法 貪心演算法
把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...