Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Tags
more
Archives
Today
Total
관리 메뉴

코드와이

[BAEKJOON] 2805. 나무 자르기 본문

acmicpc

[BAEKJOON] 2805. 나무 자르기

코드와이 2021. 2. 22. 23:42

 

이분 탐색

문제링크

www.acmicpc.net/problem/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