8/17腾讯笔试-原料做冰淇淋题讨论
题目
做冰淇淋需要 n 种原料,现每种原料有存货 W = [w1, w2, ...] 个,对应的价格 V = [v1, v2, ...]
存货用完就需要去商店买,现共有钱 M 元。
问,总共能做多少冰淇淋。
思考
大概思想是,先按存货的个数排序,再每次买后一个与前一个的差值*当前总价(如果买得起,否则能买多少买多少)。同时当前买东西的总价要滚动增加。
其中注意存货相等的物料特殊处理。
自己试了几个用例都能过。不知道哪里还有问题。
def fun(W, V, M):
map =list(zip(W, V))
map = sorted(map, key=lambda x: (x[0], x[1])) # 先按个数排序,再按价格排序
W = [x[0] for x in map]
V = [x[1] for x in map]
res = W[0] # 最少能做的个数
curSum = V[0] # 当前总价
i = 0
while i <= len(W) - 2: # 遍历到倒数第二个元素位置
while W[i+1] == W[i]: # 若与后面的存货相等,则要将后面的价格加入curSum
curSum += V[i + 1]
i += 1
if i == len(W) - 1: # 若已经遍历到最后一个了,说明后面的所有存货都相等了。直接统一计算即可。
res += M // curSum
return res
if M - curSum * (W[i + 1] - W[i]) >= 0: # 如果买得起就买
res += W[i+1] - W[i]
M -= curSum * (W[i + 1] - W[i])
else: # 否则能买多少买多少
res += M // curSum
curSum += V[i + 1] # 滚动增加当前总价
i += 1
# 若存货已全部消耗完时,还有余额,则所有统一购买。
res += M // curSum
return res
W = [5, 5, 5]
V = [2, 1, 3]
m = 10
print(fun(W, V, m)) #腾讯##笔试题目#