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;
	}
	
}