코드와이
[BAEKJOON] 2805. 나무 자르기 본문
이분 탐색
문제링크
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
package acmicpc.Silver3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 나무자르기 {
static int n;
static long[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
int h = Integer.parseInt(st.nextToken());
long low = 0;
long high = 0;
arr = new long[n];
st = new StringTokenizer(br.readLine());
for(int i = 0 ; i < n ; i++) {
arr[i] = Long.parseLong(st.nextToken());
high = Math.max(high, arr[i]);
}
long mid = (high + low)/2;
long result = 0;
while(low <= high) {
mid = (high + low) / 2;
long ans = check(mid);
if(ans >= h) {
if(result < mid) result = mid;
low = mid + 1;
}
else {
high = mid - 1;
}
}
System.out.println(result);
}
public static long check(long mid) {
long ans = 0;
for(int i = 0 ; i < n ; i++) {
ans += arr[i] - mid > 0 ? arr[i] - mid : 0;
}
return ans;
}
}
'acmicpc' 카테고리의 다른 글
[BAEKJOON] 13300. 방 배정 (0) | 2021.02.23 |
---|---|
[BAEKJOON] 11727. 2Xn 타일링 2 (0) | 2021.02.22 |
[BAEKJOON] 17070. 파이프 옮기기1 (0) | 2021.02.19 |
[BAEKJOON] 2579. 계단 오르기 (0) | 2021.02.19 |
[BAEKJOON] 2606. 바이러스 (0) | 2021.02.19 |