[λ°±μ€] μμ°
[λ°±μ€] μμ°_2512
μμ°
νμ΄
βμ΄λΆνμβ (Binary Search) κΈ°λ²μ μ΄μ©ν΄μ μ°ΎμμΌνλ€.
μ²μμ κ·Έλ₯ whileλ¬ΈμΌλ‘ 1μ© μ¬λ €κ°λ©΄μ νμνλλ°, μ΄λ κ² νλ©΄ μλλ€.
μκ°ν΄μΌν μ .
1) μ§λ°© μμ°λ€μ λͺ¨λ ν©νλλ°, κ΅κ° μμ°λ³΄λ€ μ μ κ²½μ°
-> μ λΆ λ€ μμ°μ μ€ μ μμΌλ―λ‘ λ°°μ΄μ μ΅λκ°μ΄ μμ°μ΄λ€.
2) μ§λ°© μμ° μ€ κ°μ₯ μ΅μμ μμ°μΌλ‘ ν©νλλ°, κ΅κ° μμ° λ³΄λ€ λ§μ κ²½μ°
-> λͺ¨λ ν©νμ λ, κ΅κ° μμ°μ κ°κΉμ΄ μ΅λκ°μΌλ‘ λμμΌ νλ€.
3) κ·Έ μ€κ°μΌ κ²½μ°?
-> λͺ¨λ ν©νμ λ, μ€κ°μ΄ν κ°λ€μ μλ κ°μΌλ‘ μ€κ°κ° μ΄μμ μ€κ°κ°μ μ΄λ€.
μκ°ν λ λ§νλ λΆλΆ
1) μ΄λΆ νμμ λν΄μ μκ°μ λͺ»νλ€.
2) μ΅λ μμ°μ κ°μ₯ κ°κΉμ΄ κ°μ μ΄λ»κ² μ μ ν΄μΌνλ μκ°νλ€.
-> κ°μ₯ μ΅λλ‘ λλ¬νμ λ, min = midκ° λλ€.
3) μμ°μ΄ λͺ¨λ κ°μ κ²½μ°λ μ΄λ»κ² ν΄μΌν κΉ κ³ λ―Όνλ€. -> μ΅μμ μμ°μΌλ‘λ§ μ΄λ£¨μ΄μ‘κΈ° λλ¬Έμ λ°λ‘ λΉΌμΌνλ€.
n = int(input())
data = list(map(int, input().split()))
m = int(input())
data.sort()
if sum(data) <= m: # λͺ¨λ ν©νμ λ, μμ°λ³΄λ€ μ μ κ²½μ°
print(max(data))
elif min(data) * n > m: # κ°μ₯ μ΅μμ μμ°μΌλ‘ μ΄λ£¨μ΄μ‘μ λ, μμ°μ΄ μ μ κ²½μ°
min, max = 1, min(data)
result = 0
while True:
mid = (min + max) // 2
if mid * n == m or min == mid:
result = mid
break
elif mid * n > m:
max = mid
else:
min = mid
print(result)
else: # μ΅μ μμ° μ΄μ μ΅λ μμ° μ΄νλ‘ λ§λ€ μ μμ λ, μμ°μ΄ λ§μ κ²½μ°
min, max = data[0], data[-1]
result = 0
while True:
mid = (min + max) // 2
ans = 0
for i in data:
if i <= mid:
ans += i
else:
ans += mid
if ans == m or min == mid:
result = mid
break
elif ans > m:
max = mid
else:
min = mid
print(result)