본문 바로가기
Programming Solve/BOJ

BOJ 2805 - 나무 자르기 / C++

by msm1029 2022. 3. 4.
반응형

문제 링크 : https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

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

www.acmicpc.net

 

 

문제 풀이

나무들의 높이가 주어지고 절단기의 길이가 x일 때 (trees[i] - x)만큼 집에 나무를 가져갈 수 있다.

적어도 m미터의 나무를 가져가기 위한 절단기의 최대 길이를 구하면 된다.

이를 구하기 위해 이분 탐색을 이용한다.

 

일반적인 이분 탐색은 원소 값들을 탐색하지만 해당 문제에서는 원소 값들을 탐색해서는 답을 찾을 수 없다.

따라서 0부터 나무의 최대 높이를 이분 탐색하여 절단기의 길이를 임의로 정하고 잘린 나무의 합을 구한 뒤 최댓값 최솟값을 변경해나가며 답을 탐색한다.

 

소스 코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    int n, m; //나무의 수 n, 집으로 가져가려는 나무의 길이 m
    vector<int> trees;

    cin >> n >> m;

    for(int i=0; i<n; i++){
        int tmp;
        cin >> tmp;
        trees.push_back(tmp);
    }

    sort(trees.begin(), trees.end());

    int l = 0, r = trees[n-1];
    int ans;

    while(l <= r) {
        int mid = (l + r) / 2;
        long long sum = 0;

        for(int i=0; i<n; i++){
            if(trees[i] > mid) {
                sum += (trees[i] - mid);
            }
        }

        if(sum >= m) {
            ans = mid;
            l = mid + 1;
        }
        else {
            r = mid - 1;
        }
    }

    cout << ans;
}

 

반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 1120 - 문자열 / C++  (0) 2022.03.08
BOJ 1654 - 랜선 자르기 / C++  (0) 2022.03.04
BOJ 2579 - 계단 오르기 / C++  (0) 2022.02.28
BOJ 11723 - 집합 / C++  (0) 2022.02.27
BOJ 1100 - 하얀 칸 / C++  (0) 2022.02.27