본문 바로가기
온라인저지

[BOJ] 2805번: 나무 자르기

by plzfday 2018. 8. 9.

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

 

나무를 자르는 것을 이분 탐색으로 구할 수 있다. 1부터 주어진 나무의 최대 길이까지 이분 탐색을 하면서 잘라서 얻은 나무가 더 많으면 위 부분으로 조절하면 되고 반대로도 같은 방식으로 하면 된다.

하지만 그 필요한 양만큼만 못 가져갈 때도 있으므로 그럴땐 한 번 더 mid를 구한 것이 답이다.

참고: 파라매트릭 서치

#include <cstdio>
#include <algorithm>
using namespace std;

int n, m, maxH = -987654321, tree[1000001];

int main()
{
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &tree[i]);
        maxH = max(maxH, tree[i]);
    }

    int s = 1, f = maxH, mid, ans = 0;

    while (s <= f) {
        mid = (s + f) >> 1;
        long long cut = 0;
        for (int i = 0; i < n; ++i)
            cut += (tree[i] - mid < 0 ? 0 : tree[i] - mid);
        if (cut >= m) ans = mid, s = mid + 1;
        else f = mid - 1;
    }
    printf("%d\n", ans);

    return 0;
}

 

'온라인저지' 카테고리의 다른 글

[BOJ] 9465번: 스티커  (0) 2018.08.30
[BOJ] 1976번: 여행 가자  (0) 2018.08.11
[BOJ] 1654번: 랜선 자르기  (0) 2018.08.09
[BOJ] 10815번: 숫자 카드  (0) 2018.08.09
[BOJ] 1162번: 도로포장  (0) 2018.08.07
[BOJ] 10545번: 뚜기뚜기메뚜기  (0) 2018.08.07

댓글