題目 : UVa
對一個整數 k,利用以下 2 個規則
可以得出一個特定的序列 Sk : A1、A2 . . . An,其中 An = 1
規則
- 當 Ak 是偶數 : Ak = Ak-1 / 2
- 當 Ak 是奇數 : Ak = 3 * Ak-1 + 1
本題目會輸入 2 個正整數 a 、 b,並求出在 [ a , b ] 區間中,序列長度最長者
例如 : 以下列舉出前幾個數的序列長度
Sk | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
長度 | 1 | 2 | 8 | 3 | 6 | 9 | 17 | 4 | 20 | 7 |
因此若輸入 1 10
答案就是 20
( S7 )
測資
Input :
1 10
100 200
201 210
900 1000
Output :
1 10 20
100 200 125
201 210 89
900 1000 174
解法
很簡單的算術題,但是如果真的傻傻的每次都從 a “ 重新 “ 算到 b,會浪費掉很多時間
因為題目會給很多組測資,裡面一定會有大量重複的區間
因此,我們可以用空間換取時間,把算過的 Sk 給記錄下來
這邊我選擇只記錄到 S10000,因為題目給定的輸入範圍就是 ( 0, 10000 )
但是我們有可能會遇到超過 10000 的數字,比如 9999 -> 29998 (爆了)
所以超出 10000 的數字我們還是必須要土法煉鋼
但在 10000 內的數字我們可以很快的就得到答案
例如 :
上面我們已經紀錄了 1 ~ 10 的長度了
現在要計算 64
S64 : 64 -> 32 -> 16 -> 8
在這裡遇到 8 ( 已經紀錄過 ),因此剩下的部分就會跟 S8 重疊
所以長度就是 S64 = 3 + S8 = 7
程式碼
1 |
|