思路就是按原材料个数排序然后逐个逐个的补齐落差来购买一直到不能再购买为止
做冰淇淋需要 n 种原料,现每种原料有存货 W = [w1, w2, ...] 个,对应的价格 V = [v1, v2, ...]
存货用完就需要去商店买,现共有钱 M 元。
问,总共能做多少冰淇淋。
def maxGet(money, goods, prices):
get = min(goods) # 现有储存能生产的量
goods = list(map(lambda x: x-get, goods)) # 更新库存
goods, prices = zip(*sorted(zip(goods, prices))) # 将goods,price都按库存剩余量排序
goods, prices = list(goods), list(prices)
goods.append(float('inf')) # 添加哨兵
index = cost = 0
while 1:
gap = goods[index+1]-goods[index] # 补齐index与index+1间差距的最大购买量
cost += prices[index] # 补齐一组0到index时需要的花费
if gap*cost < money: # 完全补齐后还有余钱
money -= gap*cost
get += gap
index += 1
else:
get += money // cost
break
return get
n,m = map(int,input().split(' '))
goods = list(map(int, input().split((' '))))
price = list(map(int, input().split((' '))))
print(maxGet(m,goods,price))
注:
zip相当与压缩 ,zip(*)相当于解压。
举例说明:
x=["a","1"]
y=["b","2"]
z = list(zip(x,y))
print (list(zip(x,y)))
print (list(zip(*z)))
结果为:
[('a', 'b'), ('1', '2')]
[('a', '1'), ('b', '2')]