문제 링크 : https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

문제 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기를 이용해서 나무를 구할것이다. 목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 톱날이 땅으로부터 H미터 위로 올라간다. 그 다음, 한 줄에 연속해있는 나무를 모두 절단해버린다. 따

www.acmicpc.net

 문제 설명 

 

1.나무의 갯수와 필요한 나무의 길이를 입력받고 다음줄에 나무의 높이 가 주어진다.

2. 톱질로 나무를 자를때 똑같은 위치에서 잘라야한다.

3. 그때 몇 m 에서 톱질해야 필요한 나무이상을 가져갈수있을까 ?  이때의 나무 높이의 최대 값 출력

 

 알고리즘 

 

이분탐색을 이용하여 나무 높이를 구해주었다.

 

반잘라서 나오는 높이가 목표보다 크거나 같다-> lowmid

목표보다 작다-> himid

 

1. lo= 0 , hi = 20 , mid = 10 ,sum = 22 >= M(7) -> lo=mid+1
2. lo= 10 , hi = 20 , mid = 15 ,sum = 7 >= M(7) -> lo=mid

3. lo= 15 , hi = 20 , mid = 17 ,sum = 3 < M(7) -> hi=mid

4. lo= 15 , hi = 17 , mid = 16 ,sum = 5 < M(7) -> hi=mid

lo(15) 출력

 

 코드 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
 
ll N, M;
int arr[1000000];
 
int main() {
    int max_num = -1;
    cin >> N >> M;
    for (int i = 0; i < N; i++){
        cin >> arr[i];
        max_num = max(max_num, arr[i]);
    }
 
    //hi는 max_num 으로 시작.
    int lo = 0, hi = max_num;
    // 이분 탐색 시작
    while (lo + 1 < hi) {
        int mid = (lo + hi) / 2;
 
        long long sum = 0;
        for (int i = 0; i < N; i++)
            if (arr[i] > mid) sum += arr[i] - mid;
 
 
        
        if (sum >= M) lo = mid;
 
        else hi = mid;
    }
    cout << lo;
    
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

다른 문제는 보통 lo = mid+1 ,hi = mid-1 로 지정했는데 이문제만좀 특이(?) 해서 오래 걸렸다 ,,

'c++ > 백준' 카테고리의 다른 글

백준 14499번 : 주사위 굴리기  (0) 2020.04.16
백준 1780번 : 종이의 개수  (0) 2020.04.14
백준 2343번: 기타레슨  (0) 2020.04.14
백준 13904번 : 과제  (0) 2020.04.13
백준 1629번 : 곱셈  (0) 2020.04.13
ariz1623