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

Chương trình tìm giá trị lớn nhất tại một chỉ mục nhất định trong một mảng có giới hạn bằng Python

Giả sử chúng ta có ba giá trị, n, chỉ mục và maxSum. Hãy xem xét một mảng gọi là nums, chúng ta phải tìm nums [index] và nums thỏa mãn các điều kiện sau -

  • kích thước của nums là n

  • Tất cả các phần tử trong n đều dương.

  • | nums [i] - nums [i + 1] | <=1 cho tất cả i, 0 <=i

  • Tổng tất cả các phần tử của nums không vượt quá maxSum.

  • nums [index] được tối đa hóa.

Vì vậy, nếu đầu vào là n =6, index =3, maxSum =8, thì đầu ra sẽ là 2 vì, chúng ta có thể nhận được một mảng như [1,2,2,2,1,1], thỏa mãn tất cả điều kiện và ở đây nums [3] được tối đa hóa.

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

  • left:=thương số của maxSum / n, right:=maxSum + 1

  • ans:=0

  • trong khi trái

    • mid:=left + quotient of (right-left) / 2

    • ind_l:=(giữa 1 + tối đa 1 và (giữa chỉ mục)) * thương số của (tối thiểu của chỉ mục và (giữa 1) / 2 + | tối thiểu là 0, giữa chỉ-1 |

    • ind_r =(giữa + tối đa là 1 và (giữa- (n-chỉ số-1))) * thương số của (tối thiểu của (n-chỉ số) và giữa) / 2 + | tối thiểu là 0 và (giữa- (n-chỉ số -1) -1) |

    • nếu ind_l + ind_r <=maxSum thì

      • ans:=mid

      • left:=mid + 1

    • nếu không,

      • right:=mid

  • trả lại ans

Ví dụ

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

def solve(n, index, maxSum):
   left, right = maxSum//n, maxSum+1
   ans = 0
   while(left<right):
      mid = left + (right-left)//2
      ind_l = (mid-1+max(1,mid-index))*min(index,mid-1)//2 + abs(min(0,mid-index-1))
      ind_r = (mid+max(1,mid-(n-index-1)))*min(n-index, mid)//2+ abs(min(0,mid-(n-index-1)-1))

      if ind_l + ind_r <=maxSum:
         ans = mid
         left = mid+1
      else:
         right = mid
   return ans

n = 6
index = 3
maxSum = 8
print(solve(n, index, maxSum))

Đầu vào

6, 3, 8

Đầu ra

2