문제 (https://www.acmicpc.net/problem/2805)
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
이분 탐색하는 값 (mid): 절단기의 높이
절단기의 높이가 mid일 때, 나무를 자르고 남은 길이들의 총합이 m 이상이면?
- 더 큰 mid 값으로 m 이상을 구할 수도 있으므로 start를 mid + 1로 지정한다.
[소스코드]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* BOJ 2805번: 나무 자르기 | |
2021-05-25 | |
Binary Search */ | |
#include <iostream> | |
#include <algorithm> | |
using namespace std; | |
int main(){ | |
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); | |
long long n, m, max = -1; | |
long long start, end, mid, sum; | |
cin >> n >> m; | |
int arr[n]; | |
for(int i = 0 ; i < n ; i++) cin >> arr[i]; | |
sort(arr, arr+n); | |
start = 0; | |
end = arr[n - 1]; | |
while(start <= end){ | |
sum = 0; | |
mid = (start + end) / 2; | |
for(int i = 0 ; i < n ; i++){ | |
if(arr[i] - mid > 0) sum += arr[i] - mid; //자른 나무 길이 | |
} | |
if(sum >= m){ | |
start = mid + 1; | |
if(mid > max) max = mid; | |
} | |
else end = mid - 1; | |
} | |
cout << max; | |
return 0; | |
} |

'ALGORITHM > BOJ' 카테고리의 다른 글
[BOJ] 10816번 숫자 카드 2 (C++) (0) | 2021.12.19 |
---|---|
[BOJ] 1654번 랜선 자르기 (C++) (0) | 2021.12.19 |
[BOJ] 2521번 예산 (C++) (0) | 2021.12.19 |
[BOJ] 1920번 수 찾기 (C++) (0) | 2021.12.16 |
[BOJ] 12904번 A와 B (C++) (0) | 2021.11.24 |