[ ALGORITHM ]/[ 백 준 ]
[BAEKJOON] 2805번 : 나무 자르기
HiStar__
2020. 8. 14. 16:38
문 제
소 스 코 드
#include <iostream>
#include <algorithm>
typedef long long int INT;
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
int N, M;
std::cin >> N >> M;
INT *trees{ new INT[N] };
INT Max{ 0 };
for (int i = 0; i < N; ++i) {
std::cin >> trees[i];
Max = std::max(Max, trees[i]);
}
INT left{ 0 }, right{ Max };
INT mid, ans{ 0 }, remain;
while (left <= right) {
mid = (left + right) / 2;
remain = 0;
for (int i = 0; i < N; ++i)
if(mid < trees[i]) remain += trees[i] - mid;
if (remain >= M) {
ans = std::max(ans, mid);
left = mid + 1;
} else {
right = mid - 1;
}
}
std::cout << ans << '\n';
delete[] trees;
}
풀 이
-
목재절단기를 통하여 가장 긴 나무를 얻는 방법은 목재를 자르고 남은 나무를 가지고 필요한 나무를 구하는 방법이다.
-
적어도 M미터의 나무를 집에 가져가는 방법이기 때문에 M미터 이상의 목재가 나와도 된다.
-
위와 같은 조건을 통하여 0부터 가장 큰 나무의 길이의 범위를 이분탐색을 통하여 결과를 찾아내면 된다.
출 력 값
문 제 출 처
문제 링크 : https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
문제 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고,
www.acmicpc.net