-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBJ-2805.py
More file actions
61 lines (39 loc) ยท 3.32 KB
/
BJ-2805.py
File metadata and controls
61 lines (39 loc) ยท 3.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# ๋ฌธ์
# ์๊ทผ์ด๋ ๋๋ฌด M๋ฏธํฐ๊ฐ ํ์ํ๋ค. ๊ทผ์ฒ์ ๋๋ฌด๋ฅผ ๊ตฌ์
ํ ๊ณณ์ด ๋ชจ๋ ๋งํด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์, ์ ๋ถ์ ๋ฒ๋ชฉ ํ๊ฐ๋ฅผ ์์ฒญํ๋ค. ์ ๋ถ๋ ์๊ทผ์ด๋ค ์ง ๊ทผ์ฒ์ ๋๋ฌด ํ ์ค์ ๋ํ ๋ฒ๋ชฉ ํ๊ฐ๋ฅผ ๋ด์ฃผ์๊ณ , ์๊ทผ์ด๋ ์๋ก ๊ตฌ์
ํ ๋ชฉ์ฌ์ ๋จ๊ธฐ๋ฅผ ์ด์ฉํด์ ๋๋ฌด๋ฅผ ๊ตฌํ ๊ฒ์ด๋ค.
# ๋ชฉ์ฌ์ ๋จ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค. ๋จผ์ , ์๊ทผ์ด๋ ์ ๋จ๊ธฐ์ ๋์ด H๋ฅผ ์ง์ ํด์ผ ํ๋ค. ๋์ด๋ฅผ ์ง์ ํ๋ฉด ํฑ๋ ์ด ๋
์ผ๋ก๋ถํฐ H๋ฏธํฐ ์๋ก ์ฌ๋ผ๊ฐ๋ค. ๊ทธ ๋ค์, ํ ์ค์ ์ฐ์ํด์๋ ๋๋ฌด๋ฅผ ๋ชจ๋ ์ ๋จํด๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์, ๋์ด๊ฐ H๋ณด๋ค ํฐ ๋๋ฌด๋ H ์์ ๋ถ๋ถ์ด ์๋ฆด ๊ฒ์ด๊ณ , ๋ฎ์ ๋๋ฌด๋ ์๋ฆฌ์ง ์์ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด, ํ ์ค์ ์ฐ์ํด์๋ ๋๋ฌด์ ๋์ด๊ฐ 20, 15, 10, 17์ด๋ผ๊ณ ํ์. ์๊ทผ์ด๊ฐ ๋์ด๋ฅผ 15๋ก ์ง์ ํ๋ค๋ฉด, ๋๋ฌด๋ฅผ ์๋ฅธ ๋ค์ ๋์ด๋ 15, 15, 10, 15๊ฐ ๋ ๊ฒ์ด๊ณ , ์๊ทผ์ด๋ ๊ธธ์ด๊ฐ 5์ธ ๋๋ฌด์ 2์ธ ๋๋ฌด๋ฅผ ๋ค๊ณ ์ง์ ๊ฐ ๊ฒ์ด๋ค. (์ด 7๋ฏธํฐ๋ฅผ ์ง์ ๋ค๊ณ ๊ฐ๋ค) ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด๋ ์์ ์ ์ ๋๋ 0์ด๋ค.
# ์๊ทผ์ด๋ ํ๊ฒฝ์ ๋งค์ฐ ๊ด์ฌ์ด ๋ง๊ธฐ ๋๋ฌธ์, ๋๋ฌด๋ฅผ ํ์ํ ๋งํผ๋ง ์ง์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ค๊ณ ํ๋ค. ์ด๋, ์ ์ด๋ M๋ฏธํฐ์ ๋๋ฌด๋ฅผ ์ง์ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด์ ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
# ์
๋ ฅ
# ์ฒซ์งธ ์ค์ ๋๋ฌด์ ์ N๊ณผ ์๊ทผ์ด๊ฐ ์ง์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ค๊ณ ํ๋ ๋๋ฌด์ ๊ธธ์ด M์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 1,000,000, 1 โค M โค 2,000,000,000)
# ๋์งธ ์ค์๋ ๋๋ฌด์ ๋์ด๊ฐ ์ฃผ์ด์ง๋ค. ๋๋ฌด์ ๋์ด์ ํฉ์ ํญ์ M๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ธฐ ๋๋ฌธ์, ์๊ทผ์ด๋ ์ง์ ํ์ํ ๋๋ฌด๋ฅผ ํญ์ ๊ฐ์ ธ๊ฐ ์ ์๋ค. ๋์ด๋ 1,000,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ ์ ๋๋ 0์ด๋ค.
# ์ถ๋ ฅ
# ์ ์ด๋ M๋ฏธํฐ์ ๋๋ฌด๋ฅผ ์ง์ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด์ ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
import sys
N, M = map(int, sys.stdin.readline().split())
trees = list(map(int, sys.stdin.readline().split()))
start = 0
end = max(trees)
result = 0
while (start <= end):
mid = (start + end) // 2
total = 0
for tree in trees:
if tree > mid:
total += tree - mid
if total >= M:
result = mid
start = mid + 1
if total < M:
end = mid - 1
print(result)
# total >= M์ด๊ฒ ํ๋ ์ต๋์ H๊ฐ์ target_value๋ผ๊ณ ํ๋ฉด,
# ๊ทธ ๊ฐ์ binary search๋ก ์ฐพ๋๋ค.
# ์ด๋, target_value๋ 0๋ถํฐ max(trees)๊น์ง์ ๋ฒ์์์ ์ฐพ๋๋ค.
# total >= M ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ ์ค, ํ์ฌ๊น์ง ๊ฐ์ฅ ํฐ ๊ฐ์ result์ ์ ์ฅํ๊ณ ,
# ๋ค์ ํ๋ณด๋ฅผ ์ฐพ์์ ๋ฒ์๋ฅผ binary search๋ก ์ขํ๋๊ฐ๋ค.
# ์ด๋, total >= M์ด๋ฉด, start = mid + 1๋ก ๋ฒ์๋ฅผ ์ขํ๊ณ ,
# total < M์ด๋ฉด, end = mid - 1๋ก ๋ฒ์๋ฅผ ์ขํ๋ค.
# start > end๊ฐ ๋๋ฉด, ๋ ์ด์ target_value์ ํ๋ณด๊ฐ ์๋ค๋ ๋ป์ด๋ฏ๋ก,
# ๋ง์ง๋ง์ผ๋ก ์ ์ฅ๋ ๊ฐ์ธ result๋ฅผ ์ถ๋ ฅํ๋ค.
## lesson 1. ์ด์ง ํ์์ while ๋ฌธ์ผ๋ก ๊ตฌํ ๊ฐ๋ฅ. ์ด๋์ ์กฐ๊ฑด์ start <= end.
## lesson 2. ์ด์ง ํ์์์ ๋ง์ง๋ง์ผ๋ก ๋จ๋ ๋ฒ์๋ ์ซ์๊ฐ 1, 2, 3๊ฐ์ฉ ๋จ๋ ๊ฒฝ์ฐ์ธ๋ฐ,
## ๊ทธ ์ด๋ค ๊ฒฝ์ฐ์๋ start > end๊ฐ ๋๋ฉด ๋์ด์ ํ์ํ ํ๋ณด๊ฐ ์์.