python 飢餓的小易(網易筆試題)


本周早些時候,學弟給我發了一道網易的筆試題,飢餓的小易,感覺有點意思~分享給大家

 

題目描述:

小易總是感覺飢餓,所以作為章魚的小易經常出去尋找貝殼吃。最開始小易在一個初始位置x_0。對於小易所處的當前位置x,他只能通過神秘的力量移動到 4 * x + 3或者c。因為使用神秘力量要耗費太多體力,所以它只能使用神秘力量最多100,000次。貝殼總生長在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等)。小易需要你幫忙計算最少需要使用多少次神秘力量就能吃到貝殼。

 

輸入:

輸入一個初始位置x_0,范圍在1到1,000,000,006

 

輸出:

輸出小易最少需要使用神秘力量的次數,如果使用次數使用完還沒找到貝殼,則輸出-1

 

乍一看這道題,是有點懵逼的,如果用暴力法來做100%超時。以我的經驗來看估計這是一道數學問題,我們就分析一下題目描述中的關鍵信息吧,看看有沒有什么玄機。小章魚只能移動到4 * x + 3或者8 * x + 7,那我們認為f(x)=4 * x + 3, g(x)=8 * x + 7。關鍵部分到了,我瞪倆眼睛觀察了好久,終於發現

1. f(g(x)) = g(f(x))  我們可以認為最終小章魚的移動路線是可以用fg表示的字符串,而且fg可以隨意調換位置~所以說膩,ffggffgf=fffffggg

2. f(f(f(x)))=g(g(x)) 也就是說,每做3次f移動等於2次g移動,那么我們可以將結果的fg串中每3個f換成2個g,那么結果的fg串是一個最多包含2個f的fg串~所以說膩,fffffggg=ffggggg

現在解題思路就很清晰了,以0,f,ff為起始位置,每次都移動g,看什么時候能移動到能被1000000007整除的位置。代碼如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-


def get_result(n):
    l_ = [n, n * 4 + 3, 16 * n + 15]
    for j, m in enumerate(l_):
        for i in range(100000):
            m = (8 * m + 7) % 1000000007
            if m == 0:
                return i+j+1
    return -1

if __name__ == '__main__':
    n = input()
    print get_result(n)

 

好啦,這道題到此已經完美解決啦~

希望對大家有所幫助~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM