居然是考察二分搜索,确实没想到。思路是查找一个介于0和最大的inventory的数字 mid,所有球寻找一个介于0和最大inventory的数字mid,使得全部球中,大于mid的球数都被卖掉,一部分(也可以是0)等于mid的球数被卖掉。通过二分查找的过程,使得最后剩下的没达到数量order的球可以通过剩余为mid的球的种类售卖来填满。
class Solution:
def maxProfit(self, inventory: List[int], orders: int) -> int:
inventory.sort()
l = 0
r = inventory[-1]
while l < r:
mid = l + (r - l)//2
count = 0
for iv in inventory:
if iv > mid:
count += (iv - mid)
if count > orders:
l = mid + 1
else:
r = mid
res = 0
count = 0
for iv in inventory:
if iv > mid:
count += (iv - l)
res += (iv + l+1) * (iv - l)//2
res += (orders - count)*l
return res%(10**9+7)