본문 바로가기
알고리즘/BOJ

[Python] 백준 2513: 통학버스

by PIAI 2021. 9. 25.

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

 

2513번: 통학버스

첫째 줄에는 세 개의 양의 정수 N, K, S가 빈칸을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 아파트 단지의 수이며 2 ≤ N ≤ 30,000이다. 두 번째 정수 K는 1 ≤ K ≤ 2,000이며, 통학버스의 정원

www.acmicpc.net

1. 학교를 기준으로 왼쪽 오른쪽을 나누어준다. (어차피 학교로 다시 돌아오면 현재 버스 인원이 0명이 되기 때문)

2. 최대힙을 이용하여 거리가 먼순으로 버스에 태운다. (가까운 곳을 우선으로 하면 1 번가 야할 먼 곳을 2번 갈경우도 생기기때문)

3. 현재 버스 인원 + 다음에 가야 할 아파트 인원이 최대를 넘을 경우 학교에 내려다 주고 다시 간다.

from heapq import heappush, heappop

n, k, s = map(int, input().split())
info = [tuple(map(int, input().split())) for _ in range(n)]
lt, rt = [], []
ans = 0

def calc(v):
    global ans
    pNum = 0
    tmp = 0
    while v:
        dis, cnt = heappop(v)
        tmp = max(-dis, tmp)
        if pNum + cnt > k:
            ans += tmp * 2
            heappush(v, (dis, cnt-(k-pNum)))
            pNum = 0
            tmp = 0
        else:
            pNum += cnt

    if tmp:
        ans += tmp * 2
        tmp, pNum = 0, 0

for x in info:
    if x[0] < s:
        heappush(lt, (x[0]-s, x[1]))
    if x[0] > s:
        heappush(rt, (s-x[0], x[1]))

calc(lt)
calc(rt)
print(ans)

'알고리즘 > BOJ' 카테고리의 다른 글

[Python] 백준 2590: 색종이  (0) 2021.09.26
[Python] 백준 13975: 파일 합치기 3  (0) 2021.09.26
[Python] 백준 1082: 방 번호  (0) 2021.09.25
[Python] 백준 1083: 소트  (0) 2021.09.25
[Python] 백준 1700: 멀티탭 스케쥴링  (0) 2021.09.19

댓글