반응형
문제
https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
풀이
이진 탐색을.. 완전히 이해하고 싶었다.
간단한 문제인줄 알았는데 난관을 많이 만나버렸다..
일단,
Test case로
2 10
3 9
가 주어진다면 답이 0이 아니라 1이 되어야한다. 즉 처음 시작할 때 start값을 1로 세팅해주어야 한다.
그리고.. 시간초과가 자꾸 나서 뭐가 문제인지 찾아보다가..
for문 사용 방식에 있어서 1번으로 하니 통과가 됐다... 2번으로 쓰신 분들 1번으로 바꿔서 해보세요
#1
for i in tree:
if i > mid:
sum += i - mid
#2
for i in range(len(tree)):
if tree[i] > mid:
sum += tree[i] - mid
코드
import sys
read = sys.stdin.readline
n,m = map(int,read().split())
tree = list(map(int,read().split()))
tree.sort()
st,end = 1,tree[-1]
result = 0
while st<=end:
mid = (st+end)//2
sum = 0
for i in tree: # for i in range(len(tree)): 이렇게 하면 python통과 못함..
if i > mid:
sum += i - mid
if sum < m:
end = mid -1
else:
result = mid
st = mid + 1
print(result)
반응형
'알고리즘' 카테고리의 다른 글
[백준/1753][Python] 최단경로 (0) | 2023.09.19 |
---|---|
[백준/17129][C++] 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유 (0) | 2023.09.14 |
이진탐색 (0) | 2023.09.07 |
[백준/18405][Python] 경쟁적 전염 (0) | 2023.08.31 |
다이나믹 프로그래밍 개념 정리 (0) | 2023.06.24 |