Python程式檢查強盜是否能搶劫金庫
假設有N個強盜試圖搶劫一個金庫。那裡有一個警衛,但他出去G段時間,之後他會回來。每個強盜都有特定的時間來搶劫金庫,但最多隻有兩個可以同時進入金庫。現在問題是我們必須檢查他們是否能夠搶劫金庫而不會被警衛抓住?我們必須記住 -
如果一個強盜在時間t進入金庫,而另一個強盜在同一時間出來,那麼就像他們從未在同一時間在金庫裡一樣。
如果警衛在時間G進入金庫,而一個強盜恰好在時間G出來,警衛不會注意到強盜。
因此,如果輸入類似於N = 3 G = 5 time = [3,5,2],則輸出將為True,因為存在可能的安排,即 -
- 在時間t=0,強盜1進入並在t=3出來
- 在時間t=0,強盜2進入並在t=5出來
- 在時間t=3,強盜3進入並在t=5出來
為了解決這個問題,我們將遵循以下步驟 -
- 如果time中所有元素的總和 > 2*G,則
- 返回False
- 否則,當time中所有元素的總和 <= G時,則
- 返回True
- 否則,
- valid := 一個大小為G + 1的陣列,最初所有值都為False
- valid[0] := True
- 對於time中的每個x,執行
- 對於從G到0的範圍i,遞減1,執行
- 如果i-x >= 0且valid[i-x],則
- valid[i] := True
- 如果i-x >= 0且valid[i-x],則
- 對於從G到0的範圍i,遞減1,執行
- 如果time中所有元素的總和 - valid[i]為True時,從0到valid大小範圍內的所有i的最大值 <= G,則
- 返回True
- 否則,
- 返回False
示例
讓我們看看以下實現以獲得更好的理解 -
def solve(N, G, time): if sum(time) > 2*G: return False elif sum(time) <= G: return True else: valid = [False]*(G+1) valid[0] = True for x in time: for i in range(G,-1,-1): if i-x >= 0 and valid[i-x]: valid[i] = True if sum(time) - max(i for i in range(len(valid)) if valid[i]) <= G: return True else: return False N = 3 G = 5 time = [3,5,2] print(solve(N, G, time))
輸入
3,5,[3,5,2]
輸出
True
廣告