Giả sử chúng ta có một danh sách các số được gọi là số đếm trong đó số đếm [i] đại diện cho số mục thuộc loại i. Chúng ta cũng có một giá trị khác k. Chúng tôi phải tìm số lượng nhóm kích thước k tối đa mà chúng tôi có thể tìm thấy, sao cho mỗi nhóm phải có các mục thuộc các loại riêng biệt.
Vì vậy, nếu đầu vào giống như counts =[2, 3, 5, 3] k =2, thì đầu ra sẽ là 6, vì cho bốn loại mục được biểu diễn bằng a, b, c, d tương ứng. Chúng ta có thể có các nhóm k =2 sau đây, trong đó tất cả các phần tử đều thuộc loại phân biệt:[(c, a), (b, a), (c, b), (c, b), (d, a), (d, a)].
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Xác định một hàm khả thi (). Điều này sẽ tính đến số lượng, nhóm, k
- bắt buộc:=nhóm * k
- đối với tôi trong phạm vi từ 0 đến kích thước số đếm, hãy thực hiện
- temp:=số lượng tối thiểu [i], nhóm và bắt buộc
- bắt buộc:=bắt buộc - tạm thời
- nếu bắt buộc giống 0, thì
- trả về True
- trả về Sai
- Xác định một hàm giải quyết (). Điều này sẽ có giá trị, k
- res:=0
- l:=0
- r:=tổng của tất cả các phần tử có trong số lượng
- while l <=r, do
- m:=l + tầng của (r - l) / 2
- nếu có thể (số đếm, m, k) là đúng, thì
- l:=m + 1
- res:=tối đa là res và m
- nếu không,
- r:=m - 1
- trả lại res
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
def possible(counts, groups, k): required = groups * k for i in range(len(counts)): temp = min(counts[i], groups, required) required -= temp if required == 0: return True return False def solve(counts, k): res = 0 l = 0 r = sum(counts) while l <= r: m = l + (r - l) // 2 if possible(counts, m, k): l = m + 1 res = max(res, m) else: r = m - 1 return res counts = [2, 3, 5, 3] k = 2 print(solve(counts, k))
Đầu vào
[2, 3, 5, 3], 2
Đầu ra
6