Mảng inventory[i] = số bóng màu i. Khách đặt orders bóng. Giá bóng màu = số lượng còn lại của màu đó (bán 1 → giá giảm 1). Tìm tổng giá trị lớn nhất, modulo 109+7.
Ví dụ: inventory=[5,7], orders=6 → 31. Bán màu 1: 5,4; màu 2: 7,6,5,4. Tổng = 5+4+7+6+5+4 = 31.
Giải thuật (Tìm kiếm nhị phân ngưỡng giá)
- Tìm ngưỡng
midsao cho tổng số bóng có giá >mid≤orders(binary search trên [0, 1e7]). - Với
midtìm được: bán tất cả bóng giá >mid(tổng giá = sum(i*(i+1)/2 - mid*(mid+1)/2)), trừorders. - Bóng còn lại bán hết giá
mid:ans += orders * mid. - Trả về
ans % (10**9+7).
Ví dụ minh họa
def solve(inventory, orders):
low, high = 0, 10000000
while low < high:
mid = (low + high) // 2
s = sum(i - mid for i in inventory if i > mid)
if s > orders:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
ans = 0
for i in inventory:
if i > mid:
ans += i*(i+1)//2 - mid*(mid+1)//2
orders -= i - mid
ans += orders * mid
return ans % (10**9 + 7)
inventory = [5,7]
orders = 6
print(solve(inventory, orders))
Đầu vào
[6,8,7,11,5,9], [0,0,2], [2,3,5]
Đầu ra
31