PS/Baekjoon Online Judge

[백준 2805] 나무 자르기 [C]

kimyoungrok 2021. 7. 29. 15:43

백준 - 2805


풀이

입력받은 높이들 중에서 최대높이를 찾아 last로 지정하고, 절단기로 자를 나무의 높이(mid)를 기준으로 이분탐색을 사용해 풀이했다.

mid보다 높은 높이의 나무만 자르며 필요한 M미터를 충족시킬때 result로 갱신해주었다.


소스코드

#include <stdio.h>
int arr[1000001];
int main(){
    int N, M;
    long long last = 0;
    scanf("%d %d", &N, &M);
    for (int i = 0; i < N; i++){
        scanf("%d", &arr[i]);
        last < arr[i] && (last = arr[i]);
    }
    long long temp = 0, result = 0, first = 0, mid;
    while (first <= last){
        mid = (first + last) / 2;
        temp = 0;
        for (int i = 0; i < N; i++)
            arr[i] > mid && (temp += (arr[i] - mid));
        if (temp >= M && result < mid)
            result = mid;
        result < mid ? last = mid-1 : (first = mid+1);
    }
    printf("%lld\n", result);
}

출처

 

2805번: 나무 자르기

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

www.acmicpc.net

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 7568] 덩치 [C]  (0) 2021.07.30
[백준 4949] 균형잡힌 세상 [C]  (0) 2021.07.29
[백준 01016] 제곱 ㄴㄴ 수 [C]  (0) 2021.07.29
[백준 2108] 통계학 [C]  (0) 2021.07.28
[백준 1966] 프린터 큐 [C]  (0) 2021.07.28