1.英雄和怪都有能力值,英雄只能打能力值小於自己能力值的怪,每打完乙隻怪獲得乙個金幣,任意時刻可以用乙個金幣換取 1 點能力值,但金幣數不能為負(初始為0)。英雄可以以隨意順序打怪,怪物可以不用打完,求可獲取金幣數的最大值。
>> 輸入
1 32 2 1
說明:第一行第乙個數表示英雄的初始能力值,第二個數表示怪物總數;第二行表示每個怪物的能力值
>> 輸出
2說明:英雄先打了能力值為 1 的怪物,把獲得的 1 金幣換成 1 點能力值,則現在有 2 點能力值,把剩下的怪物打完,總共獲得 2 金幣
import sysdef 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 sysdef 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依次進棧...