λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜ 문제 풀이/Binary Search

[λ°±μ€€]2512번: μ˜ˆμ‚°

by syLim___ 2023. 2. 28.
728x90

https://www.acmicpc.net/problem/2512

 

2512번: μ˜ˆμ‚°

첫째 μ€„μ—λŠ” μ§€λ°©μ˜ 수λ₯Ό μ˜λ―Έν•˜λŠ” μ •μˆ˜ N이 μ£Όμ–΄μ§„λ‹€. N은 3 이상 10,000 μ΄ν•˜μ΄λ‹€. λ‹€μŒ μ€„μ—λŠ” 각 μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ„ ν‘œν˜„ν•˜λŠ” N개의 μ •μˆ˜κ°€ λΉˆμΉΈμ„ 사이에 두고 μ£Όμ–΄μ§„λ‹€. 이 값듀은 λͺ¨λ‘ 1 이상

www.acmicpc.net


(지방별 μš”μ²­μ˜ˆμ‚° 쀑 μ΅œλŒ“κ°’)*N 의 값이 총 μ˜ˆμ‚° M보닀 κ°™κ±°λ‚˜ 큰 κ²½μš°μ—λŠ” μ˜ˆμ‚°μ„ 각 지방이 μš”μ²­ν•œ λŒ€λ‘œ λ°°μ •ν•΄μ£Όλ©΄ λ˜μ§€λ§Œ,

κ·Έλ ‡μ§€ μ•Šμ€ κ²½μš°λŠ” μƒν•œμ•‘μ„ λ°°μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

 

κ°„λ‹¨ν•˜κ²ŒλŠ” μ„ ν˜•νƒμƒ‰μ„ 생각할 수 μžˆμ—ˆλŠ”λ°,

μ£Όμ–΄μ§„ m의 λ²”μœ„κ°€ 1λΆ€ν„° 1,000,000,000 μ‚¬μ΄λΌλŠ” 점이 κ±Έλ Έλ‹€.

λ¬Έμ œμ—μ„œμ˜ μ œν•œμ‹œκ°„μ€ 1초이고, νŒŒμ΄μ¬μ€ 1μ΄ˆλ™μ•ˆ μ•½ 2000만 번의 연산을 μˆ˜ν–‰ν•œλ‹€.

λ”°λΌμ„œ μ„ ν˜•νƒμƒ‰μ„ ν•˜λ©΄ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜κ²Œ λœλ‹€.

 

κ·Έλž˜μ„œ μ‹œκ°„λ³΅μž‘λ„κ°€ logN인 이진탐색을 μ“°κΈ°λ‘œ ν–ˆλ‹€.


각 지방이 μš”μ²­ν•œ μ˜ˆμ‚°κ°’μ€ λ°°μ—΄ requests에 μ €μž₯ν–ˆλ‹€.

 

μƒν•œμ„ μ΄ x일 λ•Œ μ§€κΈ‰λ˜λŠ” 총 μ˜ˆμ‚° κ³„μ‚°ν•˜κΈ°

def budget(x):
  result=0
  for i in range(n):
    if x>=requests[i]:
      result += requests[i]
    else:
      result += x
  return result

 -μ§€λ°©μ—μ„œ μš”μ²­ν•œ λΉ„μš©μ΄ μƒν•œμ•‘λ³΄λ‹€ ν¬κ±°λ‚˜ 같은 경우, result에 μƒν•œμ•‘μ„ 더해쀀닀

 -κ·Έλ ‡μ§€ μ•Šμ€ 경우, result에 μ§€λ°©μ—μ„œ μš”μ²­ν•œ λΉ„μš©μ„ 더해쀀닀

 -resultλ₯Ό λ¦¬ν„΄ν•œλ‹€


μƒν•œμ„  x κ²°μ •ν•˜κΈ°

start = 0
end = max(requests)

result = 0
while start <= end:
  mid = (start+end)//2
  if budget(mid)<=m:
    result=mid
    start=mid+1
  else:
    end=mid-1

print(result)

 -μ‹œμž‘μ :0, 끝점: μš”μ²­ κΈˆμ•‘ 쀑 μ΅œλŒ“κ°’

 -μƒν•œμ„ μ΄ m일 λ•Œ μ§€κΈ‰λ˜λŠ” 총 μ˜ˆμ‚°μ΄ M보닀 μž‘μœΌλ©΄, result에 m을 μ €μž₯ ν›„ m보닀 큰 λ²”μœ„λ₯Ό 탐색

 -μƒν•œμ„ μ΄ m일 λ•Œ μ§€κΈ‰λ˜λŠ” 총 μ˜ˆμ‚°μ΄ M을 λ„˜μ–΄κ°€λ©΄, m보닀 μž‘μ€ λ²”μœ„λ₯Ό 탐색

 


전체 μ½”λ“œ

import sys
input = sys.stdin.readline

#μƒν•œμ„  x일 λ•Œ 총 μ§€κΈ‰ μ˜ˆμ‚° 계산
def budget(x):
  result = 0
  for i in range(n):
    if x >= requests[i]:
      result += requests[i]
    else:
      result += x
  return result

#μž…λ ₯λ°›κΈ°
n = int(input())
requests = list(map(int,input().split()))
m = int(input())

#μ˜ˆμ‚°μ΄ μΆ©λΆ„ν•˜μ—¬ 각 μ§€λ°©μ—μ„œ μš”μ²­ν•œλŒ€λ‘œ μ§€κΈ‰ν•  수 μžˆλŠ” 경우
if max(requests)*n <= m:
  print(max(requests))
  exit()

    
#binary search둜 κ°€μž₯ 큰 μƒν•œμ•‘ μ°ΎκΈ°
result = 0
start=0
end=max(requests)

while start <= end:
  mid = (start+end)//2
  if budget(mid) <= m:
    result = mid
    start = mid+1
  else:
    end = mid-1

print(result)
728x90