10026: Shoemaker's Problem
description
Transcript of 10026: Shoemaker's Problem
1
10026: Shoemaker's Problem ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 10026: Shoemaker's Problem 解題者:王振宇 解題日期: 2014 年 3 月 16 日 題意:鞋匠有 N件工作要完成。他每天只能做一件工作。
並且他知道這些工作分別要幾個工作天才能完成( 1<=工作天 <=103)另外,他也知道每個工作被延誤一天所需被罰的罰金( 1<=罰金 <=104) 。延誤的天數為從今天算起到該工作開始的那天(所以只有第一件工作沒有罰金)。
你的任務是寫一個程式幫助鞋匠找出完成這 N個工作的先後順序,使得罰金最少。
2
題意範例:編號 天數 罰金 1 3 42 1 10003 2 24 5 5以第一組測試資料為例說明:若工作的順序是 1 2 3 4 ,那罰金為 : 0*4 + 1000*3 + 4*2 + 6*5 =3038 。若工作的順序是 2 1 3 4 ,則罰金為: 0*1000 + 1*4 + 4*2 + 6*5 =42 。
所以第二種工作順序的罰金較少( 42 < 3038 )。輸出條件:對每組測試資料輸出一列,為這 N個工作
的順序使得罰金最少。工作之間以一空白字元分隔。如果有不只一組答案,請輸出字典順序最小的那組。各組測試資料間亦請輸出一空白列。
2
Discussion :Solution : 排序,排程
i.如果有不只一組答案,請輸出字典順序最小的那組 工作編號最小的 不能用陣列的 index 來記錄,因為排序後就不是原來的編
號了,因此需要新變數來記錄輸入順序的編號。使用 Struct 記錄 1. 編號 2. 天數 3. 罰金
ii.衡量權重?• 用性價比的概念
★ 罰金 / 天數 : 找出只要一天不做會罰最多的先做★ 類似於貪婪的想法★ 在電腦的世界用除法會有誤差,可能被測資影響。
編號 天數 罰金 性價 1 3 4 4/3 2 1 1000 10003 2 2 14 5 5 1 順序: 2 => 1 => 3 => 4
2
• 用排序 +比較的想法
std:: Sort <algorithm>template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
return value convertible to bool return TRUE then => arg1 , arg2 Not modify any of its args => use const for args How do we define function ? I . a 天數 *b 罰金 vs. b 天數 *a 罰金 II. 當上述的值相同時,輸入編號的比較 Imp :
If ( a 天數 *b 罰金 == b 天數 *a 罰金 ) then return a 編號 < b 編號 Else return a 天數 *b 罰金 < b 天數 *a 罰金
Tips :I. 輸出的每列資料用換行做間隔
★ 第一個資料前不用換行★
II. 代替 Struct 且不須傳入 Compare comp★ 使用 Operator Overloading★
T = O ( N * log2 (N) )
2