ETH官方钱包

切換
舊版
前往
大廳
主題

ZeroJudge - f160: 1. 音檔剪輯 解題心得

Not In My Back Yard | 2020-07-26 00:00:13 | 巴幣 0 | 人氣 229

題目連結:


題目大意:
第一列給定兩正整數 t 、 n (1 ≦ t ≦ 3000 , 1 ≦ n ≦ 10 ^ 4),代表片段長度的上限以及音檔的靜音時間之標籤數目。

接著一列給定 n 個由小排到大的正整數,代表這 n 個靜音標籤的時間戳記。第一個戳記不會大過 t ,且每兩個戳記之間的間隔也不超過 t 。最後一個戳記不超過 10 ^ 8,必且該戳記代表著音檔的結尾 。

從一個靜音標籤到另一個靜音標籤 (或是從音檔開頭到某個靜音標籤,可以將音檔開頭視作一個靜音標籤),藉此將音檔分割出來的稱為一個「區間」。試問,將音檔完整分割(區間不重疊、也沒有其餘遺漏部分,同時最長的區間長度不超過 t)的最少所需區間數為何?



範例輸入:
輸入範例一:
5 8
1 4 6 8 12 15 16 18

輸入範例二:
8 8
2 4 6 8 12 15 16 18

輸入範例三:
12 11
3 4 6 8 12 15 16 18 20 23 25


範例輸出:
輸出範例一:
5

輸出範例二:
3

輸出範例三:
3


解題思維:
貪婪演算法(Greedy Algorithm)即可,意即從頭開始,每次切割出區間的時候盡量地長。最後切出來的區間個數即是最少的。

例如輸入範例一的:
5 8
1 4 6 8 12 15 16 18

1 4 6 8 12 15 16 18
一開始就直接從第二個數字開始(因為第一個數字保證不超過 t),同時用一個變數 L 紀錄上個區間的結尾於何處(初始化之值為 0)。
而 4 - L = 4 - 0 = 4 < t ,還沒超過 t 所以不用急著切。
區間數 = 0 、 L = 0

1 4 6 8 12 15 16 18
6 - L = 6 - 0 = 6 > t ,超過 t 了,所以切出一個區間同時更新 L 的值。
區間數 = 1 、 L = 4 (因為 4 是前面一個標籤的值,所以區間是切到 [0, 4])

1 4 6 8 12 15 16 18
8 - L = 8 - 4 = 4 < t
區間數 = 1 、 L = 4

1 4 6 8 12 15 16 18
12 - L = 12 - 4 = 8 > t ,超過 t 了,所以切出一個區間同時更新 L 的值。
區間數 = 2 、 L = 8

1 4 6 8 12 15 16 18
15 - L = 15 - 8 = 7 > t ,超過 t 了,所以切出一個區間同時更新 L 的值。
區間數 = 3 、 L = 12

1 4 6 8 12 15 16 18
16 - L = 16 - 12 = 4 > t
區間數 = 3 、 L = 12

1 4 6 8 12 15 16 18
18 - L = 18 - 12 = 6 > t ,超過 t 了,所以切出一個區間同時更新 L 的值。
區間數 = 4 、 L = 16

最後因為 L 不等於最後一個標籤的值,也就是 18 。因此還要再多切出一個區間,即 [16, 18] 才是將音檔完整切割。因此所求最小最區間數為 5 個。

而其他的測資以此類推。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作