PS/BOJ

1654

easy16 2022. 5. 6. 18:50

랜선 자르기 : https://www.acmicpc.net/problem/1654

 

전형적인 바이너리 서치 문제

 

탐색하려는 범위를 랜선의 길이로 잡고, lt 및 rt를 적당한 값의 범위로 선택한다.

그리고 이진 탐색으로 최적값만 구하면 끝.

 

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

public class Main {

	static int N, K;
	static long[] arr;
	static boolean DBG = false;

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

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		K = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());
		arr = new long[K];
		for (int i = 0; i < K; i++)
			arr[i] = Integer.parseInt(br.readLine());

		long rt = Arrays.stream(arr).max().getAsLong();
		long lt = 1;
		long answer = 0;
		while (lt <= rt) {
			long mid = (rt + lt) / 2;
			long cnt = check(arr, mid);
			if (cnt >= N) {
				answer = Math.max(mid, answer);
				lt = mid + 1;
			} else {
				rt = mid - 1;
			}
		}
		System.out.println(answer);
	}

	private static long check(long[] list, long length) {
		long cnt = 0;
		for (int i = 0; i < list.length; i++) {
			cnt += list[i] / length;
		}
		return cnt;
	}

}
ex)
4 11
802
743
457
539

200