이번에 풀어본 문제는
백준 2512번 예산 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static long [] requests;
static long budget;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
requests = new long[N];
long end = Long.MIN_VALUE;
for (int i = 0; i < N; i++) {
requests[i] = Integer.parseInt(st.nextToken());
end = Math.max(end, requests[i]);
}
budget = Integer.parseInt(br.readLine());
long start = 0L;
long answer = 0L;
while (start <= end) {
long mid = (start + end) / 2;
long result = calc(mid);
if (result > budget) end = mid - 1;
else {
answer = Math.max(answer, mid);
start = mid + 1;
}
}
System.out.print(answer);
}
static long calc(long max) {
long total = 0L;
for (long req: requests) total += Math.min(req, max);
return total;
}
}
예산을 분배할 수 있는 최댓값을 구하는 문제입니다.
이분탐색을 사용하여 가능한 경우의 수를 answer과 누적 비교해서, 가장 큰 값을 마지막에 출력해주면 해결할 수 있습니다.