๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/Binary Search

[์ด์ฝ”ํ…Œ]๋–ก๋ณถ์ด ๋–ก ๋งŒ๋“ค๊ธฐ / [๋ฐฑ์ค€]2805๋ฒˆ: ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ

by syLim___ 2023. 2. 24.
728x90

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

 

2805๋ฒˆ: ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ

์ฒซ์งธ ์ค„์— ๋‚˜๋ฌด์˜ ์ˆ˜ N๊ณผ ์ƒ๊ทผ์ด๊ฐ€ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•˜๋Š” ๋‚˜๋ฌด์˜ ๊ธธ์ด M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) ๋‘˜์งธ ์ค„์—๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‚˜๋ฌด์˜ ๋†’์ด์˜ ํ•ฉ์€ ํ•ญ์ƒ M๋ณด

www.acmicpc.net


๋‘˜์ด ๊ฐ™์€ ๋ฌธ์ œ์ž„

 

์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ๋ฐฐ์—ด์„ ์ •๋ ฌ์„ ํ•˜๊ณ ,

๋†’์ด๋ฅผ ๋ฐฐ์—ด์š”์†Œ์˜ ์ตœ๋Œ“๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ 1์”ฉ ์ค„์—ฌ๋‚˜๊ฐ€๋ฉฐ ๋งค๋ฒˆ ์ž˜๋ฆฐ ๋‚˜๋ฌด์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐ, ๋น„๊ตํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์„ ์ƒ๊ฐํ–ˆ๋‹ค

 

๊ทผ๋ฐ ์ด๊ฑด ๋„ˆ๋ฌด ๋ฌด์‹ํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•˜๊ณ  ๋ฌด์—‡๋ณด๋‹ค ์‹œ๊ฐ„์ด ์—„์ฒญ ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์•˜์Œ


๊ทธ๋ž˜์„œ ์ด์ง„ํƒ์ƒ‰์œผ๋กœ ํ’€์—ˆ๋‹ค.

์ด์ง„ํƒ์ƒ‰์œผ๋กœ ํ’€๋ฉด ํƒ์ƒ‰๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ค„์—ฌ๊ฐ€๋ฉฐ ํ’€ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์—ฐ์‚ฐ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ๋ˆˆ์— ๋„๊ฒŒ ์ค„์–ด๋“ค ๊ฒƒ์ด๋‹ค.

 

์ผ๋‹จ ๋‚ด ์•„์ด๋””์–ด๋Š” ์ด๋žฌ์Œ

 -๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค

 -์‹œ์ž‘์ ์€ 0, ๋์ ์€ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰๊ฐ’(๊ฐ€์žฅ ํฐ ๊ฐ’)์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์ด์ง„ํƒ์ƒ‰ ์ˆ˜ํ–‰

 -๋‚˜๋ฌด ๊ธธ์ด๊ฐ€ ๋‚จ๋Š”๋‹ค๋ฉด ์‹œ์ž‘์  = (์ค‘๊ฐ„์ +1)๋กœ ์„ค์ •ํ•˜๊ณ  ๋‹ค์‹œ ์ด์ง„ํƒ์ƒ‰ ์ˆ˜ํ–‰

 -๋‚˜๋ฌด ๊ธธ์ด๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋ฉด ...

 

๋ฉ์ฒญ์ด์—ˆ๋˜ ๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ๊ฐ‘์ž๊ธฐ ๋ง๋„์•ˆ๋˜๋Š” ์ƒ๊ฐ์„ ํ•ด๋ฒ„๋ฆฌ๊ณ  ๋งˆ๋Š”๋ฐ..

 

 ๋‚˜๋ฌด ๊ธธ์ด๊ฐ€ ๋ถ€์กฑํ•  ๊ฒฝ์šฐ, mid๊ฐ€ start๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ mid๊ฐ’์„ 1์”ฉ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

 ๊ฐ์†Œ์‹œํ‚ค๋‹ค๊ฐ€, ์ž˜๋ฆฐ ๋‚˜๋ฌด ๊ธธ์ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์ง€๋Š” ์‹œ์ ์˜ mid๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

 

 

......?????? ^^ ???

 


๋ฌผ๋ก  ์ด๋ ‡๊ฒŒ ํ•œ๋‹ค๊ณ  ๋‹ต์ด ์•ˆ ๋‚˜์˜ค๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค

๊ทผ๋ฐ ์ด๊ฑด ์ด์ง„ํƒ์ƒ‰์ด ์•„๋‹ˆ๊ณ  ์‚ฌ์‹ค์ƒ ์„ ํ˜•ํƒ์ƒ‰์ด๋‚˜ ๋‹ค๋ฆ„์—†๋‹ค

์ตœ์•…์˜ ๊ฒฝ์šฐ(์ตœ์†Œ๋†’์ด๊ฐ€ ์ตœ์ดˆ ์ค‘๊ฐ„์ ๋ณด๋‹ค ์•„๋ž˜ ํ˜•์„ฑ๋˜๋Š” ๊ฒฝ์šฐ)์—๋Š” ์„ ํ˜•ํƒ์ƒ‰ ํ•˜๋Š” ๊ฑฐ๋ž‘ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋™์ผํ•  ๊ฒƒ์ž„.

#์ ˆ๋‹จ๊ธฐ ๋†’์ด๊ฐ€ height์ผ ๋•Œ ์ž˜๋ฆฐ ๋‚˜๋ฌด์˜ ๊ธธ์ด ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
def cut(arr, height):
  sum = 0
  for i in arr:
    if i>=height:
      sum += i - height
  return sum


def search(arr, target, start, end):
  while start <= end:
    mid = (start+end)//2
    #๊ธธ์ด๊ฐ€ ๋‚จ์œผ๋ฉด, start ์œ„์น˜ ์กฐ์ •.
    if cut(arr,mid) > target:
      start = mid + 1
    #๊ธธ์ด๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด.....^v^
    else:
      while mid >= start:
        if cut(arr,mid) >= target:
          return mid
        mid -= 1
  return None
  
n,m = map(int,input().split())
arr = list(map(int,input().split()))

arr.sort()

print(search(arr, m, 0, arr[n-1]))

์ด๊ฒŒ ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ์ง  ๋ง๋„์•ˆ๋˜๋Š” ์ฝ”๋“œ๊ณ  , ๊ฒฐ๊ณผ๋Š” ๋‹น์—ฐํžˆ ์‹œ๊ฐ„์ดˆ๊ณผ์˜€๋‹ค

 


์ œ๋Œ€๋กœ ํ’€์–ด๋ณด๊ธฐ

 

 -๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค (๊ตณ์ด ํ•„์š”์—†์Œ)

 -์‹œ์ž‘์ ์€ 0, ๋์ ์€ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰๊ฐ’(๊ฐ€์žฅ ํฐ ๊ฐ’)์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์ด์ง„ํƒ์ƒ‰ ์ˆ˜ํ–‰

 -๋‚˜๋ฌด ๊ธธ์ด๊ฐ€ ๋‚จ๋Š”๋‹ค๋ฉด ์‹œ์ž‘์  = (์ค‘๊ฐ„์ +1)๋กœ ์„ค์ •ํ•˜๊ณ  ๋†’์ด๋ฅผ ์ €์žฅ ํ›„ ๋‹ค์‹œ ์ด์ง„ํƒ์ƒ‰ ์ˆ˜ํ–‰

 -๋‚˜๋ฌด ๊ธธ์ด๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋ฉด ๋†’์ด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋์  = (์ค‘๊ฐ„์ -1)๋กœ ์„ค์ •ํ•˜๊ณ  ๋‹ค์‹œ ์ด์ง„ํƒ์ƒ‰ ์ˆ˜ํ–‰

 -์ด์ง„ํƒ์ƒ‰์ด ์ข…๋ฃŒ๋˜์—ˆ์„ ์‹œ์ ์—์„œ ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋†’์ด๋ฅผ ๋ฆฌํ„ด


์ด์ œ ์•Œ์•˜์œผ๋‹ˆ ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด๋ณด๋„๋ก ํ•˜์ž..

#์ ˆ๋‹จ๊ธฐ ๋†’์ด๊ฐ€ height์ผ ๋•Œ ์ž˜๋ฆฐ ๋‚˜๋ฌด์˜ ๊ธธ์ด ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
def cut(arr, height):
  sum = 0
  for i in arr:
    if i>=height:
      sum += i - height
  return sum


def search(arr, target, start, end):
  result = 0
  while start <= end:
    mid = (start+end)//2
    #๊ธธ์ด๊ฐ€ ๋‚จ์œผ๋ฉด, start ์œ„์น˜ ์กฐ์ •ํ•˜๊ณ  ๋†’์ด ์ €์žฅ
    if cut(arr,mid) >= target:
      result = mid
      start = mid + 1
    #๊ธธ์ด๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด, end ์œ„์น˜ ์กฐ์ •
    else:
      end = mid - 1
  return result
  
n,m = map(int,input().split())
arr = list(map(int,input().split()))

print(search(arr, m, 0, max(arr)))

728x90