腾讯笔试3:现在给你两个数组,分别代表各原材料的已有量和再购买时的单价,一组原材料(各一个)可以生产出一个食品,在给定预算下最大能生产出多少食品

311566188322_.pic_hd.jpg

思路就是按原材料个数排序然后逐个逐个的补齐落差来购买一直到不能再购买为止

做冰淇淋需要 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')]

你可能感兴趣的:(腾讯笔试3:现在给你两个数组,分别代表各原材料的已有量和再购买时的单价,一组原材料(各一个)可以生产出一个食品,在给定预算下最大能生产出多少食品)