位元組跳動校招 附加題(Python)

2021-09-12 16:35:20 字數 1437 閱讀 9328

存在n+1個房間,每個房間依次為房間1 2 3...i,每個房間都存在乙個傳送門,i房間的傳送門可以把人傳送到房間pi(1<=pi<=i),現在路人甲從房間1開始出發(當前房間1即第一次訪問),每次移動他有兩種移動策略:

a. 如果訪問過當前房間 i 偶數次,那麼下一次移動到房間i+1;

b. 如果訪問過當前房間 i 奇數次,那麼移動到房間pi;

現在路人甲想知道移動到房間n+1一共需要多少次移動;

第一行包括乙個數字n(30%資料1<=n<=100,100%資料 1<=n<=1000),表示房間的數量,接下來一行存在n個數字 pi(1<=pi<=i), pi表示從房間i可以傳送到房間pi。
輸出一行數字,表示最終移動的次數,最終結果需要對1000000007 (10e9 + 7) 取模。
示例1

2

1 2

4
開始從房間1 只訪問一次所以只能跳到p1即 房間1, 之後採用策略a跳到房間2,房間2這時訪問了一次因此採用策略b跳到房間2,之後採用策略a跳到房間3,因此到達房間3需要 4 步操作。
題意:這個題挺有意思的,給了n個門,如果你是奇數次來到這個門,那麼依照b規則,如果是偶數次來到這個門,則依照a規則,題目裡有乙個特別重要的資訊是 pi(1<=pi<=i),這說明只有偶數次來到這個門,才可以走到下乙個門,奇數次都會回到當前的門或前面的門,所以這就可以用dp來解決,dp[i]表示走完i門需要移動的步數,思考一下:dp[1]是不是一定等於2,因為你第一次來到一號門,下一次肯定是移動到pi[1]號門,因為1<=pi<=i,所以pi只能取1,所以dp[1]一定等於2,那麼dp[2]呢?如果pi[2]==2,那麼dp[2]=dp[1]+2,想想是不是?因為第一次移動到pi[2]還是自己,第二次肯定就移動到下乙個了。如果pi[2]!=2呢?那他肯定就等於dp[1] + (dp[1]-dp[0]) + 2,自己畫畫就可以知道,所以當pi[i]==i時,dp[i]=dp[i-1]+2,當pi[i]!=i時,dp[i] = dp[i-1] + (dp[i-1]-dp[pi[i-1]-1] + 2。**如下:

n = int(input())

pi = [int(x) for x in input().split()]

dp = [0]*(n+1)

dp[1] = 2

k = 2 # 當前的房間號

num = 0 # 移動的總次數

while k<=n:

if pi[k-1] == k:

dp[k] = dp[k-1] + 2

else:

dp[k] = dp[k-1] + dp[k-1] - dp[pi[k-1]-1] + 2

k += 1

print(dp[n]%1000000007)

位元組跳動校招 程式設計題(Python)

有三隻球隊,每只球隊編號分別為球隊1,球隊2,球隊3,這三隻球隊一共需要進行 n 場比賽。現在已經踢完了k場比賽,每場比賽不能打平,踢贏一場比賽得一分,輸了不得分不減分。已知球隊1和球隊2的比分相差d1分,球隊2和球隊3的比分相差d2分,每場比賽可以任意選擇兩隻隊伍進行。求如果打完最後的 n k 場...

題解 2018校招真題(位元組跳動 附加題)

二階魔方又叫小魔方,是2 2 2的立方形結構。每一面都有4個塊,共有24個塊。每次操作可以將任意一面逆時針或者順時針旋轉90 如將上面逆時針旋轉90 操作如下。nero在小魔方上做了一些改動,用數字替換每個塊上面的顏色,稱之為數字魔方。魔方上每一面的優美度就是這個面上4個數字的乘積,而魔方的總優美度...

位元組跳動2019校招前端筆試

題目描述 開心消消樂 給定乙個一維的正整數陣列,逐次選擇其中乙個數做消除,消除所獲得的分數為當前數字和左右相鄰數字的乘積 當左邊或者右邊沒有數字可以認為是1 e.g.輸入陣列 3,1,5,8 step1 消除1 獲得分數 15 3x1x5,陣列變為 3,5,8 step2 消除5,獲得分數 120 ...