Algorithm/이분 탐색

BOJ#2805 나무 자르기

밤이2209 2017. 5. 24. 17:08

BOJ#2805 나무 자르기


* 문제



* 풀이

이분 탐색



* 나의 코드



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
* BOJ#2805 EKO 나무 자르기
* https://www.acmicpc.net/problem/2805
*/

public class Main {

public static void main(String[] args) throws IOException {

int N; // 나무의 수
int M; // 가져가고 싶은 나무의 길이
int[] tree;
int maxHeight = 0;

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());

st = new StringTokenizer(br.readLine());

tree = new int[N];
for (int i = 0; i < N; i++) {

tree[i] = Integer.parseInt(st.nextToken());
maxHeight = maxHeight < tree[i] ? tree[i] : maxHeight;
}

// solve - Binary Search
int left = 0;
int right = maxHeight;
int m = (left + right) / 2;
maxHeight = 0;

while (right - left > 1) {

long amount = 0L;

for (int i = 0; i < N; i++) {

amount += tree[i] - m > 0 ? tree[i] - m : 0;
}

if (amount >= M) {

maxHeight = maxHeight < m ? m : maxHeight;

left = m;
} else {

right = m;
}

m = (left + right) / 2;
}

System.out.println(maxHeight);
}
}


'Algorithm > 이분 탐색' 카테고리의 다른 글

BOJ#13706 제곱근  (0) 2017.10.26
BOJ#1300 K번째 수  (1) 2017.10.17