前往
大廳
主題

ZeroJudge - b911: 我想跟Kevin借筷子系列4 解題心得

Not In My Back Yard | 2021-07-01 00:00:14 | 巴幣 10 | 人氣 199

題目連結:


題目大意:
輸入有多列,每列給定一正整數 n(0 ≦ n ≦ 10 ^ 18),代表有 n 支筷子,這些筷子的長度剛好為 1 ~ n。

每一次可以抓若干根的筷子過來並砍去相同的長度。例如筷子長度 3 、 4 可以砍成 0 (所以長度 3 的筷子就消失了)、 1 或是 2 、 3。

試問最少需要幾次操作才能將 n 根筷子砍到消失?



範例輸入:
3
4


範例輸出:
2
3


解題思維:
可以看到,每次操作我們可以拿較長的那一半筷子(偶數根的話恰好一半,奇數根則為大於一半的最大整數)然後將它們砍去取的數字當中最小之長度。

例如 n = 5 時,我們可以拿長度 3 、 4 、 5 的筷子,然後砍成 0(所以這根就消失了) 、 1 、 2。如此一來,筷子的長度就變成 1 、 1 、 2 、 2。

而長度相同的筷子可以在任一次操作的時候一起拿,所以上面砍完一次的例子中等價於 1 、 2,即 n = 2 的情況。同樣地,n = 2 的情況砍一次之後等價於 n = 1 的情況。

所以可以看到最少操作數為 n 在二進位表達式中所佔有的長度(位元數)。

例如 n = 5 ,其二進位表示法為 101,因此需要最少 3 次操作;例如 n = 12,其二進位表示法為 1100,因此最少需要 4 次。其他 n 值也是以此類推。




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

創作回應

更多創作