https://www.acmicpc.net/problem/2805
2805๋ฒ: ๋๋ฌด ์๋ฅด๊ธฐ
์ฒซ์งธ ์ค์ ๋๋ฌด์ ์ N๊ณผ ์๊ทผ์ด๊ฐ ์ง์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ค๊ณ ํ๋ ๋๋ฌด์ ๊ธธ์ด M์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) ๋์งธ ์ค์๋ ๋๋ฌด์ ๋์ด๊ฐ ์ฃผ์ด์ง๋ค. ๋๋ฌด์ ๋์ด์ ํฉ์ ํญ์ M๋ณด
www.acmicpc.net
๋์ด ๊ฐ์ ๋ฌธ์ ์
์ฒ์์๋ ๋จ์ํ๊ฒ ๋ฐฐ์ด์ ์ ๋ ฌ์ ํ๊ณ ,
๋์ด๋ฅผ ๋ฐฐ์ด์์์ ์ต๋๊ฐ์ผ๋ก๋ถํฐ 1์ฉ ์ค์ฌ๋๊ฐ๋ฉฐ ๋งค๋ฒ ์๋ฆฐ ๋๋ฌด์ ๊ธธ์ด๋ฅผ ๊ณ์ฐ, ๋น๊ตํด๋๊ฐ๋ ๋ฐฉ์์ ์๊ฐํ๋ค
๊ทผ๋ฐ ์ด๊ฑด ๋๋ฌด ๋ฌด์ํ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํ๊ณ ๋ฌด์๋ณด๋ค ์๊ฐ์ด ์์ฒญ ์ค๋ ๊ฑธ๋ฆด ๊ฒ ๊ฐ์์
๊ทธ๋์ ์ด์งํ์์ผ๋ก ํ์๋ค.
์ด์งํ์์ผ๋ก ํ๋ฉด ํ์๋ฒ์๋ฅผ ์ ๋ฐ์ฉ ์ค์ฌ๊ฐ๋ฉฐ ํ ์ ์์ผ๋ ์ฐ์ฐ ์ํ ์๊ฐ์ด ๋์ ๋๊ฒ ์ค์ด๋ค ๊ฒ์ด๋ค.
์ผ๋จ ๋ด ์์ด๋์ด๋ ์ด๋ฌ์
-๋ฐฐ์ด์ ์ ๋ ฌํ๋ค
-์์์ ์ 0, ๋์ ์ ๋ฐฐ์ด์ ๋ง์ง๋ง๊ฐ(๊ฐ์ฅ ํฐ ๊ฐ)์ผ๋ก ์ค์ ํ๊ณ ์ด์งํ์ ์ํ
-๋๋ฌด ๊ธธ์ด๊ฐ ๋จ๋๋ค๋ฉด ์์์ = (์ค๊ฐ์ +1)๋ก ์ค์ ํ๊ณ ๋ค์ ์ด์งํ์ ์ํ
-๋๋ฌด ๊ธธ์ด๊ฐ ๋ถ์กฑํ๋ค๋ฉด ...
๋ฉ์ฒญ์ด์๋ ๋๋ ์ฌ๊ธฐ์ ๊ฐ์๊ธฐ ๋ง๋์๋๋ ์๊ฐ์ ํด๋ฒ๋ฆฌ๊ณ ๋ง๋๋ฐ..
๋๋ฌด ๊ธธ์ด๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ, mid๊ฐ start๊ฐ ๋ ๋๊น์ง mid๊ฐ์ 1์ฉ ๊ฐ์์ํจ๋ค.
๊ฐ์์ํค๋ค๊ฐ, ์๋ฆฐ ๋๋ฌด ๊ธธ์ด๊ฐ ์ํ๋ ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์์ง๋ ์์ ์ mid๊ฐ์ ๋ฆฌํดํ๋ค.
......?????? ^^ ???
๋ฌผ๋ก ์ด๋ ๊ฒ ํ๋ค๊ณ ๋ต์ด ์ ๋์ค๋ ๊ฑด ์๋๋ค
๊ทผ๋ฐ ์ด๊ฑด ์ด์งํ์์ด ์๋๊ณ ์ฌ์ค์ ์ ํํ์์ด๋ ๋ค๋ฆ์๋ค
์ต์ ์ ๊ฒฝ์ฐ(์ต์๋์ด๊ฐ ์ต์ด ์ค๊ฐ์ ๋ณด๋ค ์๋ ํ์ฑ๋๋ ๊ฒฝ์ฐ)์๋ ์ ํํ์ ํ๋ ๊ฑฐ๋ ์๊ฐ๋ณต์ก๋๊ฐ ๋์ผํ ๊ฒ์.
#์ ๋จ๊ธฐ ๋์ด๊ฐ height์ผ ๋ ์๋ฆฐ ๋๋ฌด์ ๊ธธ์ด ๋ฆฌํดํ๋ ํจ์
def cut(arr, height):
sum = 0
for i in arr:
if i>=height:
sum += i - height
return sum
def search(arr, target, start, end):
while start <= end:
mid = (start+end)//2
#๊ธธ์ด๊ฐ ๋จ์ผ๋ฉด, start ์์น ์กฐ์ .
if cut(arr,mid) > target:
start = mid + 1
#๊ธธ์ด๊ฐ ๋ถ์กฑํ๋ฉด.....^v^
else:
while mid >= start:
if cut(arr,mid) >= target:
return mid
mid -= 1
return None
n,m = map(int,input().split())
arr = list(map(int,input().split()))
arr.sort()
print(search(arr, m, 0, arr[n-1]))
์ด๊ฒ ๋ด๊ฐ ์ฒ์์ ์ง ๋ง๋์๋๋ ์ฝ๋๊ณ , ๊ฒฐ๊ณผ๋ ๋น์ฐํ ์๊ฐ์ด๊ณผ์๋ค
์ ๋๋ก ํ์ด๋ณด๊ธฐ
-๋ฐฐ์ด์ ์ ๋ ฌํ๋ค (๊ตณ์ด ํ์์์)
-์์์ ์ 0, ๋์ ์ ๋ฐฐ์ด์ ๋ง์ง๋ง๊ฐ(๊ฐ์ฅ ํฐ ๊ฐ)์ผ๋ก ์ค์ ํ๊ณ ์ด์งํ์ ์ํ
-๋๋ฌด ๊ธธ์ด๊ฐ ๋จ๋๋ค๋ฉด ์์์ = (์ค๊ฐ์ +1)๋ก ์ค์ ํ๊ณ ๋์ด๋ฅผ ์ ์ฅ ํ ๋ค์ ์ด์งํ์ ์ํ
-๋๋ฌด ๊ธธ์ด๊ฐ ๋ถ์กฑํ๋ค๋ฉด ๋์ด๋ฅผ ์ ์ฅํ์ง ์๊ณ ๋์ = (์ค๊ฐ์ -1)๋ก ์ค์ ํ๊ณ ๋ค์ ์ด์งํ์ ์ํ
-์ด์งํ์์ด ์ข ๋ฃ๋์์ ์์ ์์ ์ ์ฅ๋์ด์๋ ๋์ด๋ฅผ ๋ฆฌํด
์ด์ ์์์ผ๋ ๋ค์ ์ฝ๋๋ฅผ ์์ ํด๋ณด๋๋ก ํ์..
#์ ๋จ๊ธฐ ๋์ด๊ฐ height์ผ ๋ ์๋ฆฐ ๋๋ฌด์ ๊ธธ์ด ๋ฆฌํดํ๋ ํจ์
def cut(arr, height):
sum = 0
for i in arr:
if i>=height:
sum += i - height
return sum
def search(arr, target, start, end):
result = 0
while start <= end:
mid = (start+end)//2
#๊ธธ์ด๊ฐ ๋จ์ผ๋ฉด, start ์์น ์กฐ์ ํ๊ณ ๋์ด ์ ์ฅ
if cut(arr,mid) >= target:
result = mid
start = mid + 1
#๊ธธ์ด๊ฐ ๋ถ์กฑํ๋ฉด, end ์์น ์กฐ์
else:
end = mid - 1
return result
n,m = map(int,input().split())
arr = list(map(int,input().split()))
print(search(arr, m, 0, max(arr)))
'์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด > Binary Search' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค]2110๋ฒ: ๊ณต์ ๊ธฐ ์ค์น (0) | 2023.03.10 |
---|---|
[๋ฐฑ์ค]2512๋ฒ: ์์ฐ (1) | 2023.02.28 |