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

Chương trình tìm tổng nhỏ nhất có thể bằng cách thay đổi các số 0 thành 1s k lần từ một danh sách các số trong Python?

Giả sử chúng ta có một danh sách các số được gọi là num và một giá trị khác là k. Chúng ta phải thực hiện thao tác sau k lần:Chọn một số bất kỳ trong danh sách. Trong biểu diễn nhị phân của số đó, chọn một bit là 0 và biến nó thành 1. Cuối cùng, chúng ta phải trả về tổng nhỏ nhất có thể có của tất cả các số sau khi thực hiện k phép toán. Nếu câu trả lời quá cao, hãy trả về chế độ kết quả 10 ^ 9 + 7.

Vì vậy, nếu đầu vào là nums =[4, 7, 3] k =2, thì đầu ra sẽ là 17, vì biểu diễn nhị phân của 4 là 100, 3 là 011 và 7 là 111. Vì chúng ta cần đặt 2 bit, chúng ta có thể đặt các bit của 4 để tạo thành 111 (7). Khi đó tổng tổng là 7 + 7 + 3 =17.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau:

  • ans:=0, i:=0

  • trong khi k khác 0, thực hiện

    • đối với mỗi n trong số, thực hiện

      • nếu (n / 2 ^ i) chẵn thì

        • ans:=ans + 2 ^ i

        • k:=k - 1

        • nếu k giống 0 thì

          • đi ra từ vòng lặp

    • i:=i + 1

  • return (ans + tổng của tất cả các phần tử của num) mod m

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn:

Ví dụ

class Solution:
   def solve(self, nums, k):
      m = (10 ** 9 + 7)
      ans = 0
      i = 0
      while k:
         for n in nums:
            if (n >> i) & 1 == 0:
               ans += 1 << i
               k -= 1
               if k == 0:
                  break
                  i += 1
      return (ans + sum(nums)) % m

ob = Solution()
nums = [4, 7, 3]
k = 2
print(ob.solve(nums, k))

Đầu vào

[4, 7, 3], 2

Đầu ra

17