豬場周邊商場有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個或以上緊鄰的相同顏色的水果,則會消除,並且消除位 置的棋...