運行要求
運行時間限制: 2sec
內存限制: 1024MB
https://atcoder.jp/contests/abc161/tasks/abc161_d微信
題目
若是一個正整數知足如下條件,那麼這個正整數能夠被稱作Lunlun數app
好比,1234,1,334能夠叫作Lunlun數, 31415,119,13579不能叫作Lunlun數spa
給定一個正整數K,求從小到大第K個Lunlun數命令行
輸入前提條件code
輸入
輸入都以如下標準從命令行輸入blog
K
輸出
輸出答案排序
例1
輸入遞歸
15
輸出隊列
23
升序排列到第15位的話
1,2,3,4,5,6,7,8,9,10,11,12,21,22,23內存
第15位是23,因此答案是23
例2
輸入
1
輸出
1
例3
輸入
13
輸出
21
例4
輸入
100000
輸出
3234566667
請注意,32位帶符號的整型可能會溢出
讀懂題目
它的意思就是說,咱們要找到符合條件的天然數當中的整數P。
整個整數P要知足十位數和百位數相差小於等於1,百位數和千位數相差小於等於1......
解題思路
1. 咱們很容易想到找到知足條件的1位數,找到知足條件的2位數,找到知足條件的3位數。。。直到找到的數的數量等於K,而後再排序
很容易想到這個圖
2. 知足條件的N位數能夠衍生,生成知足條件的N+1位數
咱們能夠簡單地發現規律,以爲能夠經過遞歸的方法遍歷到全部的數
可是本人嘗試過之後,TLE了。時間上來不及。
3. 遞歸之外還有一個queue的辦法,找到一個數後,把它衍生的數append到queue的後面
4.巧妙的是,這個queue的順序就是能夠按從小到大的順序排列的
5.產生衍生的數字的方法
給定an,衍生的數字有三個
an*10 + (an % 10 - 1)
an*10 + (an % 10)
an*10 + (an % 10+1)
an % 10 = 0的狀況下,產生的衍生有兩個
an*10 + (an % 10)
an*10 + (an % 10+1)
an % 10 = 9的狀況下,產生的衍生有兩個
an*10 + (an % 10)
an*10 + (an % 10-1)
以下面的動圖所示
代碼
from collections import deque K = int(input()) def calculate(n): q = deque() for i in range(1, 10): q.append(i) result = [] while len(result) <= n: x = q.popleft() result.append(x) m = x % 10 if m == 0: q.append(x * 10 + m) q.append(x*10+ m +1) elif m == 9: q.append(x*10 + m - 1) q.append(x * 10 + m) else: q.append(x*10 + m - 1) q.append(x * 10 + m) q.append(x*10 + m + 1) print(result[n-1]) calculate(K)
總結
這道題第一要注意到求衍生的方法
再次注意到用queue的append的話,能夠獲得升序的隊列
※ 另外,我會在個人微信我的訂閱號上推出一些文章,歡迎關注