腾讯笔试 冰淇淋店

题目描述:
做冰淇淋需要 n 种原料,现每种原料有存货 W = [w1, w2, …] 个,对应的价格 V = [v1, v2, …]
存货用完就需要去商店买,现共有钱 M 元。
问,最多能做多少冰淇淋。(1<=n,vi<=100,1<=m,wi<=10^12)
示例
输入:
3 10
2 5 3
2 1 3
输出:
4
这是当时写的代码,思路就是选存货最少的做成冰淇淋,存货全部减去这个数,再买材料,思路正确,但是复杂度太高,主要是每次找最少太费时间了,应该直接先排序的,或者根本不用找最小,就每次做一个。这道题的复杂度貌似必须是O(N)。

import sys
if __name__ == "__main__":    
    n, m = [int(x) for x in sys.stdin.readline().strip().split()]
    exist = [int(x) for x in sys.stdin.readline().strip().split()]
    money = [int(x) for x in sys.stdin.readline().strip().split()]
    total_money = sum(money)     
    ans = 0    
    min_num = min(exist)    
    ans += min_num     
    exist_buf = [i - min_num for i in exist]    
    exist = exist_buf     
    while m > 0:        
        min_num = max(1, m // total_money)        
        ans += min_num        
        need = [i - min_num for i in exist]        
        need_money = 0        
        for i in range(n):            
            exist_buf[i] = max(exist[i] - min_num, 0)            
            if need[i] < 0:                
                need_money += abs(need[i]) * money[i]             
            exist = exist_buf        
         m -= need_money    
    if m < 0:
        ans -= 1    
    print(ans)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值