[C++] 백준 2805 : 나무 자르기

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

long long N, M;
vector<long long> v;
int main(int argc, char **argv){
    scanf("%lld %lld",&N,&M);

    long long x, maxN = 0;
    for(int i=0; i<N; i++){
        scanf("%lld",&x);
        v.push_back(x);
        if(maxN < x){
            maxN = x;
        }
    }

    long long left = 1, right = maxN, mid; // 이진탐색
    long long result = 0;
    while(left <= right){
        mid = (left + right) / 2;
        long long tmp = 0;
        for(int i=0; i<v.size(); i++){
            if(v[i] >= mid){
                tmp += v[i] - mid;
            }
        }

        if(tmp >= M){
            left = mid + 1;
            result = mid;
        } else {
            right = mid - 1;
        }
    }
    printf("%lld", result);

    return 0;
}

이진 탐색이라고 생각해낼 수 있어서 뿌듯했다. 코드는 아직 익숙치못해서 블로그에 예전에 푼 이진 탐색 코드를 확인하고 풀었다. 조금 더 풀어보면 바로 생각나는 날이 오겠지...

그리고 범위 확인하고 int 말고 long long을 써야하는지 확인하자.

좋은 웹페이지 즐겨찾기