알고리즘/백준

[백준] 2805번 : 나무자르기

bigkwangs 2023. 7. 17. 22:26
728x90

https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보

www.acmicpc.net

해당 문제는 아래의 문제에서 최소값을 구하는과정을 추가된 경우이다.

https://bigkwangs.tistory.com/38

 

[백준] 2110번 : 공유기 설치

https://www.acmicpc.net/problem/2110 2110번: 공유기 설치 첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집

bigkwangs.tistory.com

적어도 M미터의 나무를 집에 가져가기 위해서 절단기에 설정할 수 있는 높이의 최댓값을 구해야 함으로 나무를 집에 가져기가위한 값을 최소값을 찾아서 그 최소값을 갖는 높이의 결과를 리턴하면 된다.

 

N, M = map(int, input().split()) # 나무의 개수, M미터의 나무를 가져가야함.

tree = list(map(int ,input().split()))
    
tree.sort() # 이분 탐색을 위해 정렬한다.

start = 1
end = tree[-1]

result = int(10e9)
ans = 0
if N == 1:
    print(tree[0] - M)
else:
    while start < end:
        mid = ( start + end ) // 2 # H값을 선정
        sum = 0
        for i in range(N):
            cost = tree[i] - mid
            if cost > 0:
                sum += cost
            
        if sum >= M: # 값이 큰경우 작은 범위로 탐색하게 한다. 높이를 늘린다.
            if result > sum:
                result = sum
                ans = mid
            start = mid+1
        else: # 값이 작은경우 큰 범위로 탐색하게 한다. 높이를 낮춘다.
            end = mid
              
    print(ans)
728x90