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

Python에서 K 하위 목록을 증가시킨 후 최소값을 최대화하는 프로그램

<시간/>

nums라고 하는 숫자 목록과 size와 k라는 두 개의 값이 있다고 가정합니다. 이제 길이 크기의 연속적인 하위 목록을 가져와 모든 요소를 ​​하나씩 증가시키는 작업이 있다고 가정합니다. 이 작업을 k번 수행할 수 있으며 가능한 가장 큰 최소값을 숫자로 찾아야 합니다.

따라서 입력이 nums =[2, 5, 2, 2, 7], size =3, k =2와 같으면 출력은 [2, 5, 2]를 증가시켜 [ 3, 6, 3, 2, 7] 그런 다음 [6, 3, 2]를 증가시켜 [3, 7, 4, 3, 7]을 얻습니다. 최소값은 3입니다.

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

  • possible() 함수를 정의하십시오. 대상이 됩니다.
  • events :=크기가 N이고 0으로 채워진 목록
  • 이동 :=0, s :=0
  • 0~N 범위의 i에 대해 다음을 수행합니다.
    • s :=s + 이벤트[i]
    • 델타 :=대상 -(A[i] + s)
    • 델타> 0이면
      • 이동 :=이동 + 델타
      • s :=s + 델타
      • i + size
      • 이벤트[i + 크기] :=이벤트[i + 크기] - 델타
  • 움직일 때 true를 반환 <=K
  • 기본 방법에서 다음을 수행합니다.
  • N :=A의 크기
  • 왼쪽 :=0, 오른쪽 :=10^10
  • 왼쪽 <오른쪽, do
    • 중간 :=(왼쪽 + 오른쪽 + 1) / 2
    • 가능하다면(mid),
      • 왼쪽 :=중간
    • 그렇지 않으면
      • 오른쪽 :=중간 - 1
  • 좌회전
  • 이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

    class Solution:
       def solve(self, A, size, K):
          N = len(A)
       def possible(target):
          events = [0] * N
          moves = s = 0
          for i in range(N):
             s += events[i]
             delta = target - (A[i] + s)
             if delta > 0:
                moves += delta
                s += delta
                if i + size < N:
                   events[i + size] -= delta
                   return moves <= K
                   left, right = 0, 10 ** 10
                   while left < right:
                      mid = (left + right + 1)//2
                   if possible(mid):
                      left = mid
                   else:
                      right = mid - 1
          return left
    ob = Solution()
    nums = [2, 5, 2, 2, 7]
    size = 3
    k = 2
    print(ob.solve(nums, size, k))

    입력

    [2, 5, 2, 2, 7], 3, 2

    출력

    3