PS/BOJ

2805

easy16 2022. 5. 7. 14:31

 

나무자르기 : https://www.acmicpc.net/problem/2805

 

 

나무의 길이 H와 비교해야할 값 M의 관계가 반비례이다.

연산도중, 범위가 int를 초과하면 오류가 발생하므로 long을 사용해준다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.*;

public class Main {

	static int N, M;
	static boolean DBG = false;
	static int[] 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());
		M = Integer.parseInt(st.nextToken());

		st = new StringTokenizer(br.readLine());
		arr = new int[N];
		for (int i = 0; i < N; i++)
			arr[i] = Integer.parseInt(st.nextToken());

		long lt = 1;
		long rt = Arrays.stream(arr).max().getAsInt();
		long hMax = 0;
		while (lt <= rt) {
			long mid = (rt + lt) / 2;
			//M보다 수확한 나무의 길이가 크거나 같을 때, 값이 유효하다.
			//H가 늘어날 수 록 M은 줄어든다. (반비례)
			if (M <= check(arr, mid)) { 
				if (DBG)
					System.out.printf("<=%d %d mid : %d\n", lt, rt, mid);
				hMax = Math.max(hMax, mid);
				lt = mid + 1;
			} else {
				if (DBG)
					System.out.printf(">%d %d mid : %d\n", lt, rt, mid);
				rt = mid - 1;
			}
		}

		System.out.println(hMax);
	}

	static long check(int[] list, long h) {
		long m = 0;
		for (int i = 0; i < list.length; i++) {
			if (h < list[i])
				m += list[i] - h;
		}
		if(DBG)
		System.out.println("m : " + m);
		return m;
	}

}