https://www.acmicpc.net/problem/2805
더보기
추가적인 테스트 케이스
@paa0609 님
2 11
10 10
정답 : 4
3 1
1 2 2
정답 : 1
@wjsqjawns님
4 10
1 4 5 7
정답:
2 5
2000000000 900000000 900000000 900000000 900000000 900000000
정답: 500000000
1 1000000000
1000000000
정답: 0
1 1
1000000000
정답: 999999999
출처: https://joey09.tistory.com/113 [joie de vivre]
접근법
이분탐색으로 min = 0, max = 최대값으로 지정해놓고 반씩 잘라가며 탐색
범위가 크므로 변수를 int형으로 하면 오버플로우나서 에러나므로 long형으로 설정 소스
소스
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] h = new int[n];
long MAX = 0;
long MIN = 0;
for(int i = 0; i < n; i++) {
h[i] = sc.nextInt();
MAX = h[i] > MAX ? h[i] : MAX;
}
long height = 0;
while(MIN <= MAX) {
height = (MAX + MIN) / 2;
long sum = 0;
for(int i = 0; i < h.length; i++) {
if(h[i] - height > 0) sum += h[i] - height;
}
//더 많이 잘라야하므로, 높이를 낮춰야함 = 아래쪽 탐색
if(sum < m) {
MAX = height - 1;
} else if(sum >= m){
//덜 잘라야하므로, 높이를 올려야함 = 위쪽탐색
MIN = height + 1;
}
}
System.out.println(MAX);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 - 10026번 적록색약 - java (0) | 2023.07.29 |
---|---|
백준 - 1753번 최단경로 - java (0) | 2023.07.29 |
백준 - 1238번 파티 - java (0) | 2023.07.29 |
백준 - 2667번 단지번호붙이기 - java (0) | 2023.07.29 |
백준 - 1260번 DFS와 BFS - java (0) | 2023.07.29 |