Skip to content

Commit 1f2dd14

Browse files
committed
[Silver II] Title: 나무 자르기, Time: 916 ms, Memory: 119468 KB -BaekjoonHub
1 parent b4c2f76 commit 1f2dd14

2 files changed

Lines changed: 51 additions & 34 deletions

File tree

백준/Silver/2805. 나무 자르기/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
### 성능 요약
66

7-
메모리: 125616 KB, 시간: 1028 ms
7+
메모리: 119468 KB, 시간: 916 ms
88

99
### 분류
1010

1111
이분 탐색, 매개 변수 탐색
1212

1313
### 제출 일자
1414

15-
2023년 10월 17일 20:51:57
15+
2024년 12월 1일 17:15:46
1616

1717
### 문제 설명
1818

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,63 @@
1-
import java.io.BufferedReader;
2-
import java.io.InputStreamReader;
3-
import java.util.Arrays;
4-
import java.util.StringTokenizer;
1+
import java.io.*;
2+
import java.util.*;
53

64
public class Main {
7-
static int N, M;
8-
static long start, end, result, high;
9-
static long[] tree;
5+
static int n, m;
6+
static int[] trees;
7+
static StringTokenizer st;
8+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
1010

1111
public static void main(String[] args) throws Exception{
12-
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13-
StringTokenizer st = new StringTokenizer(br.readLine());
12+
pre_setting();
13+
bw.append(String.valueOf(binarySearch()));
14+
bw.close();
15+
}
1416

15-
N = Integer.parseInt(st.nextToken());
16-
M = Integer.parseInt(st.nextToken());
17-
tree = new long[N];
17+
static int binarySearch(){
18+
int right, left, h, ans;
19+
long cuttingH;
1820

19-
st = new StringTokenizer(br.readLine());
20-
for (int i = 0; i < N; i++) {
21-
tree[i] = Long.parseLong(st.nextToken());
22-
}
21+
right = 0;
22+
left = trees[n - 1];
23+
ans = left;
2324

24-
Arrays.sort(tree);
25-
end = tree[N - 1];
26-
result = Long.MIN_VALUE;
27-
while(start <= end){
28-
long sum = 0;
29-
high = (end + start) / 2;
25+
while(right <= left){
26+
h = (right + left) / 2;
27+
cuttingH = cutting(h);
3028

31-
for (int i = 0; i < N; i++) {
32-
long tmp = tree[i] - high;
33-
if(tmp > 0) sum += tmp;
29+
if(cuttingH < m) left = h - 1;
30+
else{
31+
right = h + 1;
32+
ans = h;
3433
}
35-
if(sum >= M){
36-
start = high + 1;
37-
result = Math.max(result, high);
38-
}else{
39-
end = high - 1;
34+
}
35+
return ans;
36+
}
4037

41-
}
38+
39+
static long cutting(int h){
40+
long ans = 0;
41+
42+
for(int i = 0; i < n; i++){
43+
if(trees[i] <= h) continue;
44+
45+
ans += (trees[i] - h);
4246
}
43-
System.out.println(result);
47+
return ans;
48+
}
49+
50+
51+
static void pre_setting() throws Exception{
52+
st = new StringTokenizer(br.readLine());
53+
54+
n = Integer.parseInt(st.nextToken());
55+
m = Integer.parseInt(st.nextToken());
56+
57+
trees = new int[n];
58+
st = new StringTokenizer(br.readLine());
59+
for(int i = 0; i < n; i++) trees[i] = Integer.parseInt(st.nextToken());
60+
Arrays.sort(trees);
4461
}
4562

4663
}

0 commit comments

Comments
 (0)