全部评论
两种情况讨论:一种情况假设原料最多的是5个吧,计算所有原料补齐到5需要的钱,然后如果手里的钱大于或等于补齐的钱,就用二者之差除以所有原料单价,再加上5就可以了;如果手里的钱小于需要补齐的钱,可以用二分法,在最小的原料数目和最多的原料数目之间二分。这个思路a了100%
n, m = list(map(int, input().split()))
vp = list(map(int, input().split())) # 数量
prices = list(map(int, input().split())) # 价格
info = []
for v, p in zip(vp, prices):
info.append([v, p])
info = sorted(info, key=lambda x:x[0])
nums = info[0][0] # 初始份数
money = info[0][1]
for i in range(1, n):
breakFlag = 1
n = info[i][0] - info[i-1][0]
if n == 0:
breakFlag = 0
money += info[i][1]
continue
elif n > 0:
if n <= m // money:
m -= money * n
nums += n
money += info[i][1]
else:
n = m // money
m -= money * n
nums += n
money += info[i][1]
break
allPrices = sum(prices)
if m >= allPrices:
nums += (m // allPrices)
print(nums)
我排序做的,O(nlogn),ac10...不知道是不是用STL比较慢
我只A了10%。。
0.4
排序 0.6
暴力0.5 刚开始是0.4的 后来优化了下也就提了0.1
相关推荐