문제 링크 : https://www.acmicpc.net/problem/2805
2805번: 나무 자르기
문제 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기를 이용해서 나무를 구할것이다. 목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 톱날이 땅으로부터 H미터 위로 올라간다. 그 다음, 한 줄에 연속해있는 나무를 모두 절단해버린다. 따
www.acmicpc.net
문제 설명
1.나무의 갯수와 필요한 나무의 길이를 입력받고 다음줄에 나무의 높이 가 주어진다.
2. 톱질로 나무를 자를때 똑같은 위치에서 잘라야한다.
3. 그때 몇 m 에서 톱질해야 필요한 나무이상을 가져갈수있을까 ? 이때의 나무 높이의 최대 값 출력
알고리즘
이분탐색을 이용하여 나무 높이를 구해주었다.
반잘라서 나오는 높이가 목표보다 크거나 같다-> low를 mid 로
목표보다 작다-> hi를 mid 로
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 |