题目描述:
做冰淇淋需要 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)