Cho danh sách coins (giá trị đồng xu) và salaries (lương tối thiểu mỗi công nhân). Mỗi loại đồng xu có một cái, mỗi công nhân nhận đúng một đồng xu. Đếm số cách phân phối sao cho mỗi công nhân nhận được đồng xu có giá trị ≥ lương của họ. Kết quả modulo 10^9+7.
Ví dụ: coins = [1, 2, 3], salaries = [1, 2] → 4.
Quy trình giải quyết
- Sắp xếp
coinsvàsalaries. - Với mỗi
salary, dùng tìm kiếm nhị phân tìm chỉ sốidxnhỏ nhất sao chocoins[idx] >= salary. - Nếu không tìm thấy, trả về 0.
- Tính toán số cách: duyệt ngược từ công nhân cuối, nhân dồn số lựa chọn khả dụng.
- Trả về kết quả modulo
10^9+7.
Ví dụ mã nguồn
class Solution:
def solve(self, coins, salaries):
coins.sort()
salaries.sort()
num_coins = len(coins)
num_salaries = len(salaries)
dp = {}
for salary in salaries:
l, r = 0, num_coins - 1
idx = num_coins
while l <= r:
m = (l + r) // 2
if coins[m] >= salary:
idx = m
r = m - 1
else:
l = m + 1
if idx == num_coins:
return 0
dp[salary] = idx
res = 1
for i in range(num_salaries - 1, -1, -1):
salary = salaries[i]
idx = dp[salary]
res *= (num_coins - idx + 1) - (num_salaries - i)
return res % (10**9 + 7)
ob = Solution()
coins = [1, 2, 3]
salaries = [1, 2]
print(ob.solve(coins, salaries)) # Output: 4
Đầu vào
[1, 2, 3], [1, 2]
Đầu ra
4