Algorithm/BOJ

[c++][BOJ][2805] 나무 자르기

kim-hasa 2022. 2. 28. 15:32

https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

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

www.acmicpc.net

바로 이전 문제와 같은 유형의 문제입니다.

 

최대 길이와 0 사이에서 이분탐색을 해서 나무를 최대한 적게 자르는 높이를 구하는 문제입니다.

#include <iostream>
using namespace std;

long long int arr[1000000];

int main(){
    long long int n, k;
    cin >> n >> k;
    
    long long int maxLen = 0;
    long long count = 0;
    
    for(int i=0; i<n; i++){
        cin >> arr[i];
        maxLen = max(maxLen , arr[i]);
    }
    
    long long int start = 0, end = maxLen, mid;
    
    while(start <= end){
        mid = (start + end) / 2;
        
        long long int part = 0;
        long long int minus;
        
        for(int i=0; i<n; i++){
            minus = arr[i] - mid;
            
            if(minus > 0){
                part += minus;
            }
        }
        
        if(part >= k){
            start = mid + 1;
            count = max(count, mid);
        }
        else {
            end = mid - 1;
        }
    }
    
    cout << count;
}