AtCoder Context ABC 161 D Lunlun Number

運行要求
運行時間限制: 2sec
內存限制: 1024MB
https://atcoder.jp/contests/abc161/tasks/abc161_d微信

題目
若是一個正整數知足如下條件,那麼這個正整數能夠被稱作Lunlun數app

  • Lunlun數用十進制表示的話,任意兩個相鄰的位數的差的絕對值在1如下

好比,1234,1,334能夠叫作Lunlun數, 31415,119,13579不能叫作Lunlun數spa

給定一個正整數K,求從小到大第K個Lunlun數命令行

輸入前提條件code

  • 1 <= K <= 100000
  • 全部的輸入必須爲整數

輸入
輸入都以如下標準從命令行輸入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,而後再排序
很容易想到這個圖
名稱未設定.001.jpeg

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)

以下面的動圖所示
名稱未設定2.gif

代碼

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的話,能夠獲得升序的隊列

※ 另外,我會在個人微信我的訂閱號上推出一些文章,歡迎關注
二維碼.jpg

相關文章
相關標籤/搜索