切換
舊版
前往
大廳
主題

ZeroJudge - d875: 4. 窮舉的階梯問題 解題心得

Not In My Back Yard | 2020-08-01 00:03:45 | 巴幣 2 | 人氣 334

題目連結:


題目大意:
輸入有多列,每列給定一正整數 L (L ≦ 2147483647),代表要走 L 單位的距離。你一開始走的步伐距離是 1 單位。每走一步之後的步伐距離可以 +1 、 -1 或者不變。而最後一步也必須要是剛好走 1 單位抵達目的地。

例如 L = 9 ,一種走法為 1 2 3 2 1 ;L = 10 ,一種走法為 1 1 2 3 2 1。

請找到最短步數的走法。若有多個最短走法,請輸出字典序最小的。



範例輸入:
9
10


範例輸出:
1 2 3 2 1
1 1 2 3 2 1


解題思維:
觀察以下情形:
L =  9 ,所求走法為 1 2 3 2 1
L = 10 ,所求走法為 1 1 2 3 2 1
L = 11 ,所求走法為 1 2 2 3 2 1
L = 12 ,所求走法為 1 2 3 3 2 1
L = 13 ,所求走法為 1 1 2 3 3 2 1
L = 14 ,所求走法為 1 2 2 3 3 2 1
L = 15 ,所求走法為 1 2 3 3 3 2 1
L = 16 ,所求走法為 1 2 3 4 3 2 1

可以看到 L = 9 ~ 15 時,其 floor(sqrt(L)) ,也就是取平方根並取整之值皆為 3 。而其所求走法裡的最大值也皆為 3 。因此,我們可以將他們列為同一組來觀察。

L = 9 、 L = 12 ,前者走法為 1 2 3 2 1 、後者為 1 2 3 3 2 1 。一個是 1 2 …… n …… 2 1 、另一個是 1 2 …… n n …… 2 1 的形式。而此時又可以再細分為 9 ~ 11 、 12 ~ 15 者兩組。

9 ~ 11 這組是由 L = 9 延伸出來:
可以看到 L = 10 ,即是在 1 2 3 2 1 裡穿插一個 1 ,形成 1 1 2 3 2 1 。另一種可能的插法是 1 2 3 2 1 1 ,但是此序列的字典序不是最小的。
而 L = 11 ,則是在 1 2 3 2 1 裡穿插一個 2 ,形成 1 2 2 3 2 1 。與上同理,不放在右半側是因為字典序較大(因為會是 1 2 3 2 2 1)

12 ~ 15 這組也是類似於上面的情況, L = 13 、 L = 14 、 L = 15 是在 1 2 3 3 2 1 裡分別插入 1 、 2 以及 3 ,形成 1 1 2 3 3 2 1 、 1 2 2 3 3 2 1 和 1 2 3 3 3 2 1 。



因此,當得到一個 L 值時,我們可以先對其取平方根並取整,得到一個值 S 。而該值會是數列中最大的一個數(不論他是 1 …… n …… 1 還是 1 …… n n …… 1 的形式)。然後再看他是坐落於上面兩種組別的哪一組。然後計算應當插入何值(計算長度 L 與其基底數列( 1 …… n …… 1 或是 1 …… n n …… 1)總和的差值即可知道)。插入該值後得到的數列即為所求。




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

創作回應

更多創作