網易雷火筆試 優先佇列 heapq 堆

2021-10-08 20:45:56 字數 1889 閱讀 9739

豬場周邊商場有n種不同的商品,第i種商品有g_i件。現在需要組織一次買福袋的活動,

每個福袋恰好有k件不同種類的商品,求最多能組成多少個福袋。

輸入描述:

第一行為2個正整數,表示商場共有n種不同商品,每個額福袋需要k種不同商品

第二行為n個正整數,表示商場每種商品的件數。

輸出描述:

福袋個數

利用了優先佇列。每次從前k個最大的數中取出k個,並且取完之後的序列任然要保持有序。

舉例:k = 3

[10, 8, 8, 7, 7]

第一次:[9, 7, 7, 7, 7], res = 1

第二次:[8, 6, 6, 7, 7], res = 2

利用優先佇列進行排序,使得佇列一直有序

變為[8, 7, 7, 6, 6]

第三次:[7, 6, 6, 6, 6], res = 3

以此類推,關鍵是一直保持佇列有序,每次從當前序列中找出數量最多的前k中商品,進行組合。

模組heapq中一些重要的函式

import heapq

# 將x壓入堆中

# 從堆中彈出最小的元素

heapq.heapify(heap)

# 讓列表具備堆特徵,預設為小頂堆

heapq.heapreplace(heap, x)

# 彈出最小的元素,並將x壓入堆中

heapq.nlargest(n,

iter

)# 返回iter中n個最大的元素

heapq.nsmallest(n,

iter

)# 返回iter中n個最小的元素

import sys 

import heapq

deffunc

(n, k, goods)

:if n == k:

print

(min

(goods)

)elif k ==1:

print

(sum

(goods)

)else

: res =

0# 由於heapq預設的是建立小根堆,所以對goods中的所以值取負號

goods =

[-i for i in goods]

# 讓列表具有堆的特徵,將其轉為小根堆

heapq.heapify(goods)

while

len(goods)

>=3:

# 每次找出所有剩餘的數中最大的k個數,將他們組合為乙個福袋,該商品的數量減1,結果res增加1

n_largest =

for i in

range

(k):

)for i in

range

(k):

if n_largest!=

and-n_largest[-1

]>=2:

-1]+

1)n_largest.pop(

) res +=

1return res

if __name__==

'__main__'

:# n, k = list(map(int, input().split()))

# goods = list(map(int, input().split()))

n =5 k =

3 goods =[10

,8,8

,7,7

] result = func(n, k, goods)

print

(result)

演算法 heapq模組優先佇列

heapq模組,優先佇列,小頂堆,最少值放在頂部,值越小,優先順序越高 heapq.heap 從堆中彈出最小的元素,並重新調整 heapq.heap,item 新增元素新增到堆中,不會調整 heap data 1,3,5,7,9,2,4,6,8,0 for item in data ordered ...

網易雷火筆試 印表機(區間dp

有一台神奇的印表機,可列印的字母範圍大寫a z,每次只能從紙帶上的任意位置開始列印同一字母任意次數,並且可以覆蓋之前同一位置上已經列印上的字母。給定乙個目標字串,問最少需要列印多少次才能列印出給定字串。例如,目標為abcba,先列印aaaaa,再列印bbb,再列印c,所以答案為3。分析 沒什麼難的,...

網易雷火筆試 開心消消樂 沒做出來

大家都玩過開心消消樂吧 有 個m行,n列的棋盤,棋盤每個格仔中擺有乙個顏色的水果。一共有9種不同顏色的水果 用數字1 9分別標識 當玩家進行一次操作改變棋盤上水果的 布局之後,棋盤上的水果將會按以下規則重新排列 第一步 同一行或者同一列上有3個或以上緊鄰的相同顏色的水果,則會消除,並且消除位 置的棋...