본문 바로가기
PS/BOJ

백준 2805 / C++

by jaehoonChoi 2022. 7. 15.

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 <bits/stdc++.h>
using namespace std;
using ll = long long;
ll n, m, h[1000001];
 
// 높이 x로 자른 나무들의 합이 m이상인지 판별하는 함수
int check(ll x) {
    ll sum = 0;
    for (int i = 0; i < n; i++) {
        sum += max(1LL * 0, h[i] - x);
    }
    return sum >= m;
}
 
int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m;
    for (int i = 0; i < n; i++) cin >> h[i];
    ll l = 0, r = 1e9, ans = -1;
    // 높이를 이분탐색 
    // 높이의 최댓값을 구하므로.. 
    while (l <= r) {
        ll mid = (l + r) / 2;
        // 높이 mid가 가능하다면 하한을 키워줌 
        if (check(mid)) {
            l = mid + 1;
            ans = mid;
        }
        // mid가 불가능하면 상한을 줄여줌 
        else r = mid - 1;
    }
    cout << ans << '\n';
}

 

'PS > BOJ' 카테고리의 다른 글

백준 13975 / C++  (0) 2022.07.21
백준 12099 / C++  (0) 2022.07.15
백준 16118 / C++  (0) 2022.07.15
백준 1062 / C++  (0) 2022.07.15
백준 1238 / C++  (0) 2022.07.13

댓글