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