給定兩個-100到100的整數x和y,對x只能進行加1,減1,乘2操作,問最少對x進行幾次操作能得到y?
例如:a=3,b=11: 可以通過322-1,3次操作得到11;
a=5,b=8:可以通過(5-1)*2,2次操作得到8;
我們可以這樣來解這道題,計算出從a一步操作能夠得到幾,兩步操作能夠得到幾,三步操作能夠得到幾。
如何來優化這個想法,兩步操作可以是一步操作後的結果再加一步操作。這裡的一步操作是指題中給的加一減一和乘二。
那麼問題就解決了:bfs的思想解決。
def bfs(queue,target):
while queue:
x = queue.pop(0)
if x[0]==target:
return x[1]
else:
if __name__=="__main__":
a,b = 3,11
queue =
print(bfs(queue,b))
queue儲存每一輪的結果,在下一輪中取出每乙個值進行相同的處理,之後儲存進queue以完成bfs功能。
x代表當前值,x代表操作次數。
我們再看這道題:
扭蛋機2號:如果塞x(x範圍為》=0正整數)個扭蛋進去,然後就可以扭到2x+1個
扭蛋機3號:如果塞x(x範圍為》=0正整數)個扭蛋進去,然後就可以扭到2x+2個
22娘和33娘手中沒有扭蛋,需要你幫她們設計乙個方案,兩人「輪流扭」(誰先開始不限,扭到的蛋可以交給對方使用),用「最少」的次數,使她們能夠最後恰好扭到n個交給小電視君。
輸入乙個正整數,表示小電視君需要的n個扭蛋。
輸出乙個字串,每個字元表示扭蛋機,字元只能包含"2"和"3"。
這是bilibili的一道演算法題,我們依然可以用上述**進行求解:
def bfs(queue,target):
while queue:
x = queue.pop(0)
if x[0]==target:
return x[1]
else:
n = int(input())
queue =
print(bfs(queue,n))
我們可以看到和上面快手那道題的**非常相像:他們都可以用bfs的思路把所有情況進行窮舉出來,一層一層的去找是否能夠達到目標,這段**具有正確的功能但是可惜bilibili使用的資料量很大不能夠在規定時間內跑完所有的樣例。
而這道題能跑完所有樣例的**很簡單,我們優化一下這段的**。我們從後向前進行bfs,並且當結果為偶數的時候一定是扭蛋機3,結果是基數的時候為扭蛋機2.這樣的話就可以在規定時間內跑完這些**了。
9 10快手筆試
由於太過興奮,晚上月神做了乙個奇怪的夢,月神夢見自己掉進了乙個被施法的深淵,月神想要爬出此深淵。已知深淵由n級台階構成 1 n 1000 並且每次月神僅可往上爬2的整數次冪個台階 1,2,4,由你程式設計告訴月神,月神有多少種方法爬出深淵 輸入描述 輸入m行,1第一行輸入乙個數表述有多少組測試用例 ...
2018 快手筆試題latex愛好者
latex自然是廣大研究人員最喜歡使用的科研 排版工具之一。月神想在iphone 上查閱寫好的 但是無賴iphone 上沒有月神喜歡使用的閱讀軟體,於是月神也希望像tex老爺爺donald knuth那樣自己動手do it yourself乙個。在diy這個閱讀軟體的過程中,月神碰到乙個問題,已知i...
2018 9 快手筆試程式設計題
題目描述 給你二叉樹的先序和中序遍歷的值,求出中序遍歷的求和樹。每個節點的和等於其左右孩子節點的value的和。思路 先建樹,直接遞迴求和輸出就好了。我簡化了輸入,原題的輸入是字串輸入,當時一直段錯誤,卡了快乙個小時,這個 能過樣例,不知道能不能過全部的資料。include include incl...