2020 4 8 阿里巴巴筆試

2021-10-04 22:41:03 字數 3232 閱讀 1783

小強開始了他的功夫特訓,特訓的時間為n秒,有m個木頭人,每個木頭人的血量為a。小強的攻擊範圍為b,小強每次攻擊能對最多b個存活的木頭人造成1點傷害,每次攻擊需要1秒,當經過一次攻擊後木頭人的血量為0,木頭人死亡。當特訓結束時,小強最多能消滅多少個木頭人。

輸入:t

n,m,a,b

例:input:

15 5 2 2

output:

5解釋:

第一次攻擊:1 1 2 2 2

第二次攻擊:1 0 1 2 2

第三次攻擊:0 0 0 2 2

第四次攻擊:0 0 0 1 1

第五次攻擊:0 0 0 0 0

if __name__ == "__main__":

# 讀取第一行的n

num = int(sys.stdin.readline().strip())

ans =

for i in range(num):

# 讀取每一行

line = sys.stdin.readline().strip()

# 把每一行的數字分隔後轉化成int列表

values = list(map(int, line.split()))

n, m, a, b = values

if n < a:

die = 0

else:

die = min(n*b // a, m)

print(die)

有乙個方格遊戲是這樣的:給乙個n*n的矩陣,矩陣每乙個位置都有乙個值,初始的時候在左上角出發,並獲得該位置的值作為初始能量,

每次可以選擇向上、向下、向左、向右四個方向中的乙個,並且可以移動距離不大於k,且要保證到達的格仔的值要比當前位置的格仔的值要大,

否則不能移動到這個格仔,當無法移動時,遊戲結束。

現在想知道在所有可能的走的方案中,到達的位置的格仔值相加總和最大為多少。

輸入第一行乙個整數t,代表有t組測試資料。

接下來先輸入兩個整數n和k,代表矩陣的大小以及每一步最多能走多少個格仔。

接下來n行,每行n個數,代表矩陣的a的元素。

例如:輸入:

13 1

0 5 37

55 10 19

12 9 18

輸出:71

解釋:最大路徑為:0——5——10——19——37。和為71。

1、走矩陣,這種問題顯然需要動態規劃打表解決,或者廣度優先遍歷也可以解決。這裡採用動態規劃方案。對於動態規劃問題,首先需要定義dp陣列和dp陣列元素對應的意義,這裡定義dp[n][n],dp[i][j]表示從左上角走到i,j位置的最優策略。

2、對於這道題,要求到達的格仔的值要比當前位置的格仔的值要大,這個條件保證了行走過程中不會走回頭路,即一直朝著最大的目標前進,且走過的格仔不會回頭再走。這是乙個很重要的條件,如果沒有這個條件限制,打表過程中還需要記錄走過的路徑,防止回頭,但變換後的問題仍然可以求解。

3、動態規劃問題,最重要的就是遞迴表示式:

當前位置(i,j),下一步位置(k,l),(k,l)在(i,j)所能走到的下一步範圍。

d p[

k][l

]=ma

x(dp

[k][

l],d

p[i]

[j]+

arr[

k][l

])

,dp[k][l] = max(dp[k][l], dp[i][j] + arr[k][l]),

dp[k][

l]=m

ax(d

p[k]

[l],

dp[i

][j]

+arr

[k][

l]),

cond. (i,j)位置可達,(i,j)可達(k,l)

為了標註不可抵達的格仔,我們將dp初始化為-1;dp[0][0]=arr[0][0]。

4、上面提到,需要確定攻擊範圍。「每次可以選擇向上、向下、向左、向右四個方向中的乙個,並且可以移動距離不大於k」,則對應當前位置(i,j)為中心的十字形區域。

# dp[i][j]表示走到i,j位置的最優策略

# dp[i][j]等於0表示絕路

# i,j走到k,l

def find_max_path_v1(arr, n, k_):

dp =

for i in range(n):

dp[0][0] = arr[0][0]

max_sum = -1

for i in range(0, n):

for j in range(0, n):

# 不能走斜線

for k in range(max(i-k_, 0), min(i+k_+1, n)):

l=jif arr[k][l] > arr[i][j] and dp[i][j] > -1:

dp[k][l] = max(dp[k][l], dp[i][j] + arr[k][l])

if dp[k][l] > max_sum:

max_sum = dp[k][l]

for l in range(max(j-k_, 0), min(j+k_+1, n)):

k=iif arr[k][l] > arr[i][j] and dp[i][j] > -1:

dp[k][l] = max(dp[k][l], dp[i][j] + arr[k][l])

if dp[k][l] > max_sum:

max_sum = dp[k][l]

print(dp)

return max_sum

if __name__ == "__main__":

# 讀取第一行的n

num = int(sys.stdin.readline().strip())

ans =

for i in range(num):

# 讀取每一行

line = sys.stdin.readline().strip()

# 把每一行的數字分隔後轉化成int列表

values = list(map(int, line.split()))

n, k = values

arr =

for j in range(n):

line = sys.stdin.readline().strip()

res = find_max_path_v1(arr, n, k)

print(res)

阿里巴巴筆試題

1 有乙個虛擬儲存系統,若程序在記憶體中佔3頁 開始時記憶體為空 若採用先進先出 fifo 頁面淘汰演算法,當執行如下訪問頁號序列後1,2,3,4,5,1,2,5,1,2,3,4,5,會發生多少缺頁?a 7 b 8 c 9d 10 2 設有乙個順序棧s,元素s1 s2 s3 s4 s5 s6依次進棧...

阿里巴巴筆試題

題意 給定一串數字 判斷是否存在這三個元素,它們將數字串分為四個子串,其中每個子串的數字之和均相同 該3個元素不納入計算 要求時間複雜度和空間複雜度均不能超過o n 思路 奇妙的利用了單調性,列舉第一段的和,第一段的和確定了,那麼接下來的2,3,4段的和就都確定了,什麼單調性呢?就是i右移,j,k都...

阿里巴巴筆試題

1 有乙個虛擬儲存系統,若程序在記憶體中佔3頁 開始時記憶體為空 若採用先進先出 fifo 頁面淘汰演算法,當執行如下訪問頁號序列後1,2,3,4,5,1,2,5,1,2,3,4,5,會發生多少缺頁?a 7 b 8 c 9d 10 2 設有乙個順序棧s,元素s1 s2 s3 s4 s5 s6依次進棧...