목차

     

     


     

     

     

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

     

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

     

    2805번: 나무 자르기

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

    www.acmicpc.net

     


     

    해결전략

     

    이분탐색


     

    코드

     

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    int n, cnt;
    long long m, maxHeight=0;
    
    vector<long long> v;
    
    long long Cal(int x)
    {
       long long h = 0;
       
       if (x == 0) return h;
    
       for (int i = 0; i < n; i++) 
        {
            if(v[i]>=x)
                h += v[i] - x;
        }
    
        return h;
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
    
        cin >> n >> m;
        v.resize(n);
        for (int i = 0; i < n; i++) {
            cin >> v[i];
        }
    
        long long lo = 0;
        long long hi = *max_element(v.begin(), v.end());
        long long mid = 0;
    
        while (lo <= hi)
        {
            mid = (lo + hi) / 2;
    
            if (Cal(mid) >= m) {
                lo = mid + 1;
    
                if (maxHeight < mid) maxHeight = mid;
            }
            else {
                hi = mid - 1;
            }
        }
    
        cout << maxHeight;
    
        return 0;
    }

     

    mid가 0이 나오는 경우가 생겨  Division Zero가 될 수 있다.

    이런 상황을 방지하기 위해

    maxHeight = 0;  //기본값 설정.
     if ( x == 0 ) return h;
    long long mid = 0; //기본값 설정.

    다음과 같은 안전장치를 만들어야 한다. 


     

     

    유사문제

     

    https://designerd.tistory.com/entry/%EB%B0%B1%EC%A4%80-1654%EB%B2%88-CC-%EB%82%98%EC%9D%B4%EC%88%9C-%EC%A0%95%EB%A0%AC

     

    [백준 1654번 C/C++] 랜선 자르기

    목차 [백준 1654번 C/C++] 나이순 정렬 https://www.acmicpc.net/problem/1654 1654번: 랜선 자르기 첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,

    designerd.tistory.com