ALGORITHM/BOJ

[BOJ] 2805번 나무 자르기 (C++)

yegyeom 2021. 12. 19. 00:48

문제 (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로 지정한다.


[소스코드]

/* 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;
}
view raw 2805.cpp hosted with ❤ by GitHub

'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