본문 바로가기
BaekJoon/C++

2805 : 나무 자르기 (C++)

by GrayChoi 2021. 2. 10.
반응형

 

2805번: 나무 자르기

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

www.acmicpc.net


이분탐색... 어려워

#include<iostream>

using namespace std;

int N, M;

int main() {
    cin >> N >> M;

    int tree[N];
    int maxTree = 0;

    for(int i = 0; i < N; i++) {
        cin >> tree[i];
        maxTree = maxTree < tree[i] ? tree[i] : maxTree;
    }

    int left = 1; // 시작값
    int right = maxTree; // 최대값
    long long int cnt;
    int mid;
    int result = 0;

    while(left <= right) {
        mid = (left + right) / 2;
        cnt = 0;
        
        for(int i = 0; i < N; i++) {
            if(mid <= tree[i]) {
                cnt += tree[i] - mid;
            }
        }

        if(cnt >= M) { // 적어도 M미터 이상의 나무를 가져갈 수 있을 때.
            left = mid + 1;
            result = max(result, mid); // 높이의 최대값
        } else if(cnt < M) {
            right = mid - 1;
        }


    }

    cout << result << endl;

    return 0;
}
반응형

'BaekJoon > C++' 카테고리의 다른 글

18111 : 마인크래프트 (C++)  (0) 2021.02.12
1920 : 수 찾기 (C++)  (0) 2021.02.11
1654 : 랜선 자르기 (C++)  (0) 2021.02.10
1987 : 알파벳 (C++)  (0) 2021.02.09
1934 : 최소공배수 (C++)  (0) 2021.02.09

댓글