b_예산_2512

source www.acmicpc.net/problem/2512
type 📌 개발노트
topics 600-알고리즘 & 코딩테스트 610 이진탐색
types 문제풀이
정답여부 성공

문제

if 모든요청이 다 ㄱㅊ > 모두다 요청한대로
else 특정한 정수상한액 설정 그이상이면 상한액 이하면 요청한대로

입력
지방수
요청수들
총예슨

이진탐색냄새가 솔솔난다.먼가 딱 맞지않으면 이진탐색이다.(내생각에) 역시 맞음ㅋ

import sys
sys.stdin.readline()
cities = list(map(int,sys.stdin.readline().strip().split()))
budget = int(sys.stdin.readline().strip())
cities.sort(reverse=True)

def set_limit(start,end):
    if start > end:
        return end
    # 정렬된 
    mid = (start+end)//2
    b_sum = 0
    for b in cities:
        if b>mid:
            b_sum+=mid
        else:
            b_sum+=b
    if b_sum == budget:
        return mid
    elif b_sum > budget:
        # 소요되는 금액이 예산보다많음
        return set_limit(start,mid-1)
    else: 
        return set_limit(mid+1,end)

requires = sum(cities)
if budget >= requires:
    print(cities[0])
else:
    ans = set_limit(0,cities[0])
    # 상한선 필요
    print(ans)