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))
#腾讯##笔试题目#
全部评论
算法复杂度n2?
点赞 回复 分享
发布于 2019-08-18 11:02
请问你这是什么岗位的笔试题目
点赞 回复 分享
发布于 2019-08-29 17:03

相关推荐

04-16 19:19
已编辑
合肥大学 Java
刷了100道题的大老虎很想提桶:27届现在早没日常hc了,不可能找到的,等暑假9月吧
点赞 评论 收藏
分享
评论
点赞
9
分享

创作者周榜

更多
牛客网
牛客企业服务