: Wine trading in Gergovia ★★☆☆☆ 題組: Contest Volumes with Online Judge 題號: 11054: Wine trading in Gergovia 解題者:劉洙愷 解題日期: 2008 年 2 月 29 日 題意:在 Gergovia 這地方,每一位居民都是酒的推銷員, 他們每天決定他們要買或賣多少酒。然而他們有非常聰 明的交易方法,使得他們在搬運過程次數達到最小。 本題希望你重建這方法。假設他們每間的建築物 (2 ≦ n ≦ 10 5 ) 建築在直路上,而且每間建築物等距離。酒的 買賣量是 ≦ a i ≦ 1000 。搬運距離每多隔一個建築物, 搬運次數要多加一次。
2 題意範例: Sample Input Sample Output 解法: Greedy-Algorithm method 【註】
3 解法範例 (1) : 先把第一家的需要的 5 瓶酒,到其他要賣酒的地方買, 如果不夠買,就繼續往下搜尋,直到滿足,然後換 下一家。 算法: 從第 2 家搬 4 瓶給第 1 家 = 4( 瓶數 )*1( 距離 ) 從第 4 家搬 1 瓶給第 1 家 = 1 ( 瓶數 )*3 ( 距離 ) 以此列推: 4*1 + 1*3 + 1*1 + 1*1 = 9 利用兩個 for 迴圈。 時間複雜度: O(n 2 ) → O(2 2 ) ~ O(10 10 ) 。 下場: Time limit exceeded 。
4 解法範例 (2) : 第一家直接從第二家買 5 瓶酒,這時第二家會缺 1 瓶, 第二家再跟下一家買 1 瓶,依此列推。 算法: 第 2 家搬 5 瓶給第 1 家 = 5( 瓶數 )*1( 距離 ) 第 3 家搬 1 瓶給第 2 家 = 1( 瓶數 )*1( 距離 ) 以此列推: 5*1 + 1*1 + 2*1 + 1*1 = 9 只需要一個 for 迴圈。 時間複雜度: O(n) → O(2) ~ O(10 5 ) 。 結果: 。
5 討論: (1) 只要時間複雜度超過 O(n 2 ) ,程式執行時間 就會超過 Online Judge 的 3 秒。 (2) 即使減少回圈次數,程式的 Run Time 還是 不變。
6 小知識:什麼是 Greedy-Algorithm method 1. 是為了尋找最佳解。但是並不保證會產生一個最 佳的答案,而產生的答案是否是最佳化的還需要 證明。 2. 一種短視 / 近利 / 偷懶 / 貪婪的想法。 3. 每一步都不管大局,只求局部解決方法。 4. 它透過一步步的選擇局部最佳解來得到問題的 解答。 5. 它所做的每一個選擇是根據某種準則來決定的, 而且前後次的決定並無關聯性。 6. 它用來解決最佳化問題時,通常很有效率且簡 單。 7. 它並不能解決所有最佳化問題,例如:最短路 徑問題。