10026: Shoemaker's Problem

5
1 10026: Shoemaker's Prob lem ★★★☆☆ 題題Problem Set Archive with Online Judge 題題10026: Shoemaker's Problem 題題題 題題題 題題題題2014 題 3 題 16 題 題題題題題 N 題題題題題題 題題題題題 題題題 題題題題題題題題題題題題題題 題題題題題題題1<= 題題題 <=10 3 題題 題題題題題題題題題題題題 題題 ,一 題題題題題題1<= 題題 <=10 4 題題題題題題題題題題題題題題題題題題題題 題題題題題題 題題題題題題題題 題 (一)。 題題題題題題 題題題題題題題題題題題題 N 題題題題題題題題 題題題題題題題 ,。

description

10026: Shoemaker&#039;s Problem. ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 10026: Shoemaker&#039;s Problem 解題者:王振宇 解題日期: 2014 年 3 月 16 日 題意: 鞋匠有 N 件工作要完成。他 每天只能做一件工作 。並且他知道這些工作分別要幾個工作天才能完成 ( 1

Transcript of 10026: Shoemaker's Problem

Page 1: 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個工作的先後順序,使得罰金最少。

Page 2: 10026: Shoemaker's Problem

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個工作

的順序使得罰金最少。工作之間以一空白字元分隔。如果有不只一組答案,請輸出字典順序最小的那組。各組測試資料間亦請輸出一空白列。

Page 3: 10026: Shoemaker's Problem

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

Page 4: 10026: Shoemaker's Problem

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 罰金

Page 5: 10026: Shoemaker's Problem

Tips :I. 輸出的每列資料用換行做間隔

★ 第一個資料前不用換行★

II. 代替 Struct 且不須傳入 Compare comp★ 使用 Operator Overloading★

T = O ( N * log2 (N) )

2