2805 - 나무 자르기

solution

code

#include <iostream>

using namespace std;

int main()
{
    int N;
    int M;
    cin >> N;
    cin >> M;
    int * arr = new int[N];
    long long int max = -1;
    long long int min = 0;
    int tree;
    for(int i = 0; i < N; i++)
    {
        scanf("%d", &tree);
        arr[i] = tree;
        max = (max < tree) ? tree : max;
    }
    
    long long int mid;
    long long int total_timber;

    while(min <= max)
    {
        mid = (min + max) / 2;
        total_timber = 0;
        for(int i = 0; i < N; i++)
            if((arr[i] - mid) > 0) total_timber += (arr[i] - mid);
        if(total_timber < M) max = mid - 1;
        else min = mid + 1;
    }

    cout << max << endl;

    return 0;
}

ref

2805번: 나무 자르기