Baekjoon/Silver

Baekjoon 2805.EKO(나무자르기) c++ [Silver II]

Hun-bot 2025. 2. 4. 23:40
728x90
반응형

이분탐색

정렬된 범위에 특정 값을 찾거나 최적의 값을 구할 때 사용

 

left =0, right는 max로 설정 mid값을 잡아서 조건에 만족하는 최댓 값을 찾을 때까지 위해 반복

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

typedef long long ll;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int N, M;
    cin >> N >> M;
    vector<int> trees(N);
    for (int i = 0; i < N; i++)
    {
        cin >> trees[i];
    }
    int left = 0, right = *max_element(trees.begin(), trees.end()), sum = 0;
    while (left <= right)
    {
        int mid = (left + right) / 2;
        ll total = 0;
        for (int t : trees)
        {
            if (t > mid)
            {
                total += t - mid;
            }
        }
        if (total >= M)
        {
            sum = mid;
            left = mid + 1;
        }
        else
        {
            right = mid - 1;
        }
    }
    cout << sum;
    return 0;
}
728x90
반응형