Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python의 숫자 목록에서 0에서 1로 k 번 변경하여 가능한 최소 합계를 찾는 프로그램?

<시간/>

nums라는 숫자 목록과 또 다른 값 k가 있다고 가정합니다. 다음 작업을 k번 수행해야 합니다. 목록에서 아무 숫자나 선택합니다. 해당 숫자의 이진 표현에서 0인 비트를 선택하고 1로 만듭니다. 마지막으로 k 연산을 수행한 후 모든 숫자의 가능한 최소 합계를 반환해야 합니다. 답변이 너무 높으면 결과 모드 10^9+7을 반환합니다.

따라서 입력이 nums =[4, 7, 3] k =2와 같으면 4의 이진 표현은 100, 3은 011, 7은 111이므로 출력은 17이 됩니다. 2비트, 4의 비트를 설정하여 111(7)로 만들 수 있습니다. 그러면 총합은 7 + 7 + 3 =17입니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  • 답변 :=0, 나는 :=0

  • k가 0이 아닌 동안 수행

    • 숫자의 각 n에 대해 수행

      • (n / 2^i)가 짝수이면

        • ans :=ans + 2^i

        • k :=k - 1

        • k가 0과 같으면

          • 루프에서 나오다

    • 나는 :=나는 + 1

  • return (ans + nums의 모든 요소의 합) mod m

더 나은 이해를 위해 다음 구현을 살펴보겠습니다.

예시

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))

입력

[4, 7, 3], 2

출력

17