[백준(Baekjoon)][자바(java)] 2805 : 나무 자르기 / 이분 탐색

728x90

 

www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M을

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
		
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
		StringTokenizer st = new StringTokenizer( br.readLine() );
		int n = Integer.parseInt( st.nextToken() );
		int m = Integer.parseInt( st.nextToken() );
		int t[] = new int[n], i, t_max = 0;
		st = new StringTokenizer( br.readLine() );
		for( i = 0; i < n; i++ ) {
			t[i] = Integer.parseInt( st.nextToken() );
			if( t_max < t[i] ) t_max = t[i];
		}
		br.close();
		
		int low = 0, high = t_max, h = 0;
		while( low <= high ) {
			int mid = ( low + high ) / 2;
			long res = 0;
			for( i = 0; i < n; i++ )
				if( t[i] >= mid )
					res += t[i] - mid;
			if( res >= m ) {
				low = mid + 1;
				if( h < mid )
					h = mid;
			}
			else
				high = mid - 1;
		}

		System.out.println( h );
	}
}

 

( 랜선 자르기 문제와 비슷 hyunjiishailey.tistory.com/145 )

 

반응형