Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm số lượng nhóm cỡ K tối đa với các mục loại riêng biệt có thể thực hiện được bằng Python

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