前往
大廳
主題

ZeroJudge - g423: PE.Haachama cooking 解題心得

Not In My Back Yard | 2022-01-01 00:00:18 | 巴幣 0 | 人氣 170

題目連結:


題目大意:
輸入第一列給定兩正整數 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 即代表可不可行。




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

創作回應

更多創作