
https://www.acmicpc.net/problem/2512
๋ฌธ์
๊ตญ๊ฐ์ ์ญํ ์ค ํ๋๋ ์ฌ๋ฌ ์ง๋ฐฉ์ ์์ฐ์์ฒญ์ ์ฌ์ฌํ์ฌ ๊ตญ๊ฐ์ ์์ฐ์ ๋ถ๋ฐฐํ๋ ๊ฒ์ด๋ค. ๊ตญ๊ฐ์์ฐ์ ์ด์ก์ ๋ฏธ๋ฆฌ ์ ํด์ ธ ์์ด์ ๋ชจ๋ ์์ฐ์์ฒญ์ ๋ฐฐ์ ํด ์ฃผ๊ธฐ๋ ์ด๋ ค์ธ ์๋ ์๋ค. ๊ทธ๋์ ์ ํด์ง ์ด์ก ์ดํ์์ ๊ฐ๋ฅํ ํ ์ต๋์ ์ด ์์ฐ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐฐ์ ํ๋ค.
๋ชจ๋ ์์ฒญ์ด ๋ฐฐ์ ๋ ์ ์๋ ๊ฒฝ์ฐ์๋ ์์ฒญํ ๊ธ์ก์ ๊ทธ๋๋ก ๋ฐฐ์ ํ๋ค.
๋ชจ๋ ์์ฒญ์ด ๋ฐฐ์ ๋ ์ ์๋ ๊ฒฝ์ฐ์๋ ํน์ ํ ์ ์ ์ํ์ก์ ๊ณ์ฐํ์ฌ ๊ทธ ์ด์์ธ ์์ฐ์์ฒญ์๋ ๋ชจ๋ ์ํ์ก์ ๋ฐฐ์ ํ๋ค. ์ํ์ก ์ดํ์ ์์ฐ์์ฒญ์ ๋ํด์๋ ์์ฒญํ ๊ธ์ก์ ๊ทธ๋๋ก ๋ฐฐ์ ํ๋ค.
์๋ฅผ ๋ค์ด, ์ ์ฒด ๊ตญ๊ฐ์์ฐ์ด 485์ด๊ณ 4๊ฐ ์ง๋ฐฉ์ ์์ฐ์์ฒญ์ด ๊ฐ๊ฐ 120, 110, 140, 150์ด๋ผ๊ณ ํ์. ์ด ๊ฒฝ์ฐ, ์ํ์ก์ 127๋ก ์ก์ผ๋ฉด, ์์ ์์ฒญ๋ค์ ๋ํด์ ๊ฐ๊ฐ 120, 110, 127, 127์ ๋ฐฐ์ ํ๊ณ ๊ทธ ํฉ์ด 484๋ก ๊ฐ๋ฅํ ์ต๋๊ฐ ๋๋ค.
์ฌ๋ฌ ์ง๋ฐฉ์ ์์ฐ์์ฒญ๊ณผ ๊ตญ๊ฐ์์ฐ์ ์ด์ก์ด ์ฃผ์ด์ก์ ๋, ์์ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋๋ก ์์ฐ์ ๋ฐฐ์ ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์ง๋ฐฉ์ ์๋ฅผ ์๋ฏธํ๋ ์ ์ N์ด ์ฃผ์ด์ง๋ค. N์ 3 ์ด์ 10,000 ์ดํ์ด๋ค. ๋ค์ ์ค์๋ ๊ฐ ์ง๋ฐฉ์ ์์ฐ์์ฒญ์ ํํํ๋ N๊ฐ์ ์ ์๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ด ๊ฐ๋ค์ ๋ชจ๋ 1 ์ด์ 100,000 ์ดํ์ด๋ค. ๊ทธ ๋ค์ ์ค์๋ ์ด ์์ฐ์ ๋ํ๋ด๋ ์ ์ M์ด ์ฃผ์ด์ง๋ค. M์ N ์ด์ 1,000,000,000 ์ดํ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์๋ ๋ฐฐ์ ๋ ์์ฐ๋ค ์ค ์ต๋๊ฐ์ธ ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์

์กฐ๊ฑด
- ์๊ฐ ์ ํ: 1์ด
- ๋ฉ๋ชจ๋ฆฌ ์ ํ: 128MB
์ฝ๋
import sys
input = sys.stdin.readline
# ์
๋ ฅ
N = int(input())
demand = sorted(list(map(int,input().split()))) # ๊ฐ ์ง๋ฐฉ์ ์์ฐ ์์ฒญ
budget = int(input()) # ์ด ์์ฐ
n_lst = range(1,demand[-1]+1) # ์ด๋ถํ์์ ์ํ ๋ฆฌ์คํธ
# Binary Search
start,end = 0,len(n_lst)-1
while start <= end:
mid = (start+end)//2 # ์ค๊ฐ ์ธ๋ฑ์ค
limit = n_lst[mid] # ์ํ์ก ์ค์
Sum = 0 # ์ํ์ก์ ๋ฐ๋ฅธ ํฉ
# ์์ฐ ์์ฒญ ํ์
for num in demand:
if num < limit:
Sum += num
else:
Sum += limit
# ์ค๊ฐ ์ธ๋ฑ์ค ์ฌ์ค์
if Sum < budget:
start = (mid+1)
elif Sum > budget:
end = (mid-1)
else:
print(n_lst[mid])
exit(0)
# ์ถ๋ ฅ
if Sum > budget: # ์ด ์์ฐ์ ์ด๊ณผํ์ ๊ฒฝ์ฐ
print(n_lst[mid-1])
else:
print(n_lst[mid])
- ๊ฐ ์ง๋ฐฉ์ ์์ฐ ์์ฒญ
demand๋ฅผ ์ ๋ ฅ ๋ฐ์ ํ, ์ ๋ ฌํด์ค๋ค.
- ์ด๋ถ ํ์์ ์งํํ๊ธฐ ์ํด,
range(1,demand[-1]+1)์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ค๋ค.
- ์ค๊ฐ ์ธ๋ฑ์ค
mid์ ํด๋นํ๋ ์ํ์กlimit์ ํตํด์ ํฉSum์ ๊ตฌํด์ค๋ค.
์๋ฅผ ๋ค์ด demand ๊ฐ [110,120,140,150] ์ด๊ณ , limit ์ด 130์ด๋ผ๋ฉด, Sum ์ 110 + 120 + 130 + 130 ์ผ๋ก 490 ์ด ๋๋ค.
ํ์ฌ Sum ์ด budget ์ธ 485 ๋ณด๋ค ํฌ๋ฏ๋ก, end ๋ฅผ ์ผ์ชฝ์ผ๋ก ์ฎ๊ฒจ์ค๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ, ๊ฐ์ฅ budget ์ ๊ทผ์ฌํ ๊ฐ์ ์ฐพ๋๋ค.
Sum์ดbudget๋ณด๋ค ํฐ ์ํ๋กlimit๊ฐ์ด ๊ตฌํด์ก์ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์, ๋ค์ ํ ๋ฒ ํ์ธํด์ค๋ค.
n_lst[mid] ์ด ์๋ n_lst[mid-1] ์ ์ถ๋ ฅํด์ค๋ค.๋๋ ์ & ๋ฐฐ์ด ์
์ฒ์์๋ ์ด๋ป๊ฒ ๋ฌธ์ ๋ฅผ ํ์ด๋๊ฐ์ผํ ์ง ๊ณ ๋ฏผ์ ํ๋๋ฐ, ๊ทผ์ฌ์น๋ฅผ ์ฐพ๋๋ค๋ ์ ์์ ์ด๋ถํ์์ ํ์ฉํ๊ธฐ๋ก ํ ์ ์ด ์ข์๋ ๊ฒ ๊ฐ๋ค.
์ด์ ์์ ๋ณด๋ ๊ตณ์ด ์ธ๋ฑ์ฑ์ ์ํด mid ๋ฅผ ๋ง๋ค์ง ์๊ณ , range(0,demand[-1]) ๋ก ์ค์ ํ์ผ๋ฉด ๋ ๋ณด๊ธฐ ์ข์์ ๊ฒ ๊ฐ๋ค.