https://www.acmicpc.net/problem/2512
2512번: 예산
첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상
www.acmicpc.net
문제정리
N개의 예산 신청을 예산액에 맞게 부여해야 한다.
기준 예산액을 정한 후 기준 예산액보다 작은 경우 그대로 배정, 클 경우 기준 예산액으로 부여한다.
문제풀이
기준 예산액을 정해야한다.
기준 예산액을 정한 후 예산액을 계산해서 통과인지 아닌지 찾기
기준 예산액을 1부터 최대 예산액 까지 증가시키며 조건을 만족하는지 찾을 수 있다. ( 브루트 포스 )
이분 탐색으로 기준 예산액을 구해보자
만약 통과라면 기준 예산액을 높이고 불통이라면 기준 예산액을 낮춘다.
N 개의 가장 큰 예산 신청이 기준 예산액에 영향을 줌
따라서 lo = 0 , hi = max_예산신청 으로 두며 이분탐색을 하자
# 예산 배정하기
# 모든 요청 가능하면 그대로 배정
# 안된다면 특정한 상한액으로 배정 (상한액 이하는 그대로 배정)
N = int(input())
arr = []
arr = list(map(int,input().split()))
arr.sort()
M = int(input()) # 총 예산
lo = 0
hi = arr[-1]
ans = 0
def judge(mid): # mid 값으로 예산 배정이 가능한가?
total = 0
for i in range(N):
if arr[i] > mid:
total += mid
else :
total += arr[i]
return total <= M
while lo <= hi:
mid = (lo+hi) // 2
if(judge(mid)):
lo = mid + 1
ans = mid
else :
hi = mid - 1
print(ans)
'코딩 농장 > 백준 문제' 카테고리의 다른 글
[백준 Python] 2110 공유기 설치 (0) | 2022.05.23 |
---|---|
[백준 Python] 1072번 게임 (0) | 2022.05.23 |
[백준 Python] 15975번 화살표 그리기 (0) | 2022.05.22 |
[백준 Python] 1431번 시리얼 번호 (0) | 2022.05.22 |
[백준 Python] 20923번 숫자 할리갈리 게임 (0) | 2022.03.20 |