문제 >> [BOJ] 1805. 나무자르기
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | jaimport java.io.BufferedReader; import java.io.InputStreamReader; import java.util.StringTokenizer; //BOJ :: 1805 나무자르기 //2019-03-22 public class Main2805 { static int N; static long[] arr; static long M,ans; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); N = Integer.parseInt(st.nextToken());//나무 수 M = Long.parseLong(st.nextToken());//상근이가 필요한 나무의 길이 ans = Long.MIN_VALUE; arr = new long [N]; st = new StringTokenizer(br.readLine(), " "); long maxh = Long.MIN_VALUE; for(int i=0;i<N;i++) { arr[i] = Integer.parseInt(st.nextToken()); maxh = maxh<arr[i]? arr[i] : maxh; } /////////////////input bsearch(0, maxh); System.out.println(ans); } static boolean flag = false; public static void bsearch(long start, long end) { //if(flag) return; if(start>end) { return ; } long mid = (start+end)/2; //현재 절단기 높이 //종료조건 long sum = 0; for(int i=0;i<N;i++) { long tmp = arr[i]-mid; sum += ((tmp>0)? tmp : 0); } //sum이 M보다 작으면 높이를 낮춘다. //sum이 M보다 크면 높이를 높인다. if(sum>=M) { ans = ans < mid? mid:ans; bsearch(mid+1, end); } else if(sum<M) { bsearch(start, mid-1); } return; } } | cs |
모든 데이터 타입을 long 으로 해주어야 합니다
'Algorithm Problem Solving' 카테고리의 다른 글
[SWEA] 2383. 점심식사 시간 (5) | 2019.04.04 |
---|---|
[SWEA] 1949. 등산로 조성 (0) | 2019.04.01 |
[BOJ] 14502 : 연구소 (2) | 2019.03.12 |
[BOJ] 17070 : 파이프 옮기기 1 (0) | 2019.03.12 |
[SWEA] 1761 : 프로세서 연결하기 (0) | 2019.03.08 |