題目連結:
題目大意:
輸入第一列給定兩正整數 N 、 M(1 ≦ N 、 N ≦ 10 ^ 5),代表有 N 根的木棍而目標要生出 M 根筷子。接著第二列給定 N 個正整數(皆介於 1 ~ 10 ^ 9 之間,且所有木棍的長度總和 ≧ 2M),代表每根木棍的長度。
每根木棍可以分切成多段作為「一根」筷子使用,每段木棍不能組合在一起。試問產出的 M 根長度相同的筷子其長度最長可以多長?
範例輸入:
範例輸入 #1
6 2
1 1 1 2 3 4
範例輸入 #2
1 2
13
範例輸出:
範例輸出 #1
2
範例輸出 #2
3
解題思維:
因為所有木棍的長度至少有 2m,代表著我們至少能製造出長度為 1 的 2m 根(也就是 m 雙)筷子。當我們逐漸增加長度到某個時間點開始,便無法生出足夠的 2m 根筷子。
也因此,我們可以對著長度進行二分搜尋法(Binary Search),如
這題。
而對於某個長度值 L 要檢查可不可行,則相對容易。掃過每根木棍,對於某木棍長度 X,其可以生成出
floor(X ÷ L)
根筷子,其中 floor() 代表下高斯函數(對於正數來說即無條件捨去小數點)。而剩餘的長度則直接忽略,因為無法與其他木棍片段黏在一起。
然後統計總共生產出多少根長度 L 的筷子,看有沒有超過 2m 即代表可不可行。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。