阿里巴巴筆試4 20場

2022-06-07 12:51:14 字數 2924 閱讀 7106

1.英雄和怪都有能力值,英雄只能打能力值小於自己能力值的怪,每打完乙隻怪獲得乙個金幣,任意時刻可以用乙個金幣換取 1 點能力值,但金幣數不能為負(初始為0)。英雄可以以隨意順序打怪,怪物可以不用打完,求可獲取金幣數的最大值。

>> 輸入

1 32 2 1

說明:第一行第乙個數表示英雄的初始能力值,第二個數表示怪物總數;第二行表示每個怪物的能力值

>> 輸出

2說明:英雄先打了能力值為 1 的怪物,把獲得的 1 金幣換成 1 點能力值,則現在有 2 點能力值,把剩下的怪物打完,總共獲得 2 金幣

import sys

def solve(a, n, blist):

blist = sorted(blist)

curr_a = a #能力值

curr_g = 0 #當前的金幣值

max_g = 0 #可獲取的金幣最大值

for tb in blist:

if curr_a >= tb:

curr_g += 1

max_g = max(max_g,cur_g)

elif cur_g<(tb - curr_a): #當前金幣全部用來購買能力都打不過怪獸了,則退出迴圈

break

else:

curr_g -= (tb - curr_a) #花費金幣購買能力

curr_a = tb #更新能力值

curr_g += 1 #更新完能力值後繼續打怪

max_g = max(max_g,cur_g)

return max_g

lines = [t.strip().split() for t in sys.stdin.readlines() if t.strip()]

a, n = int(lines[0][0]), int(lines[0][1])

blist = [int(t) for t in lines[1]]

print (solve(a, n, blist))

2.有 n 個城市,每個城市有乙個等級值,這 n 個城市之間有 n-1 條邊,每條邊的時間權重都為 1,構成樹結構。問:從任意城市到達另乙個等級相同的城市,路徑中不能有重複邊,最小的時間是多少?(如果沒有符合要求的路徑,就返回 -1)

>> 輸入

31 2 1

1 22 3

說明:第一行的數代表城市數 n,第二行代表每個城市的等級值,接下來的 n-1 行代表每條邊的連線情況

>> 輸出

2說明:從城市 1 到城市 3,等級都為 1,經過時間是 2

import sys

def solve(n, alist, edges): #城市個數;城市等級;城市的邊

adic = {} #

reverse_adic = {} #

for i, ta in enumerate(alist):

adic[i + 1] = ta

reverse_adic.setdefault(ta, 0)

reverse_adic[ta] += 1

adj_dic = {} #

for f, t in edges:

adj_dic.setdefault(f, )

adj_dic.setdefault(t, )

#無向邊

ans_min = none

for tp in adj_dic:#迴圈遍歷城市的每乙個節點tp

pa = adic[tp] #城市tp的等級(初始節點的等級!)

if reverse_adic[pa] <= 1: #如果城市tp的等級對應的城市個數小於2,則退出本次迴圈

continue

used_edge = set() #題目要求路徑中不能有重複邊

queue = [(tp, 0)] #(初始節點tp,當前花費的時間)

flag = false

mindist = none

for r, tdist in queue:

for nxt in adj_dic[r]: #adj_dic[r]為節點r的所有相連節點列表,r -> nxt

#如果路徑沒有走過

if (r, nxt) not in used_edge and (nxt, r) not in used_edge:

#如果相連節點對應的等級等於初始節點tp的等級,則結束了從tp節點開始的迴圈

if adic[nxt] == pa:

flag = true

mindist = tdist + 1

break

#沒有結束,就繼續找

#使用過的邊需要記錄,下次不可以繼續使用了

used_edge.add((r, nxt))

#如果已經找到了就不需要繼續遍歷queue中元素了

if flag:#情況:某個節點有兩個相連節點,就對用兩條往下走的邊,其中一條邊找到了,就不需要繼

break #續在另一條找了

if ans_min == none or mindist < ans_min:

ans_min = mindist 更新最小時間

return -1 if ans_min == none else ans_min

lines = [t.strip().split() for t in sys.stdin.readlines() if t.strip()]

n = int(lines[0][0])

alist = [int(t) for t in lines[1]]

edges = [(int(f), int(t)) for f, t in lines[2:]]

print (solve(n, alist, edges))

阿里巴巴筆試題

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依次進棧...