2021. 11. 22. 00:31ㆍ알고리즘/그리디
문제
아 과제 하기 싫다. 아무 것도 안 하고 싶다. 더 적극적이고 격렬하게 아무 것도 안 하고 싶다.
있잖아. 내가 아까 책상에다가 n개의 과제 목록을 적어놨어. 각각의 과제 i는 di 일이 걸리고, 오늘로부터 ti 일 안에 끝내야 해. 그러니까 오늘이 0일이면, ti일이 끝나기 전에 제출이야. 과제는 한번 시작하면 쉬지 않고 계속해야 해. 안 그러면 머리 아파 지거든.
근데 있잖아. 내가 지금 너무, 너무 아무 것도 안 하고 싶어. 그래서 오늘은 아무 것도 안 할 거야. 더 중요한 게 뭔지 알아? 사실 나 내일도, 모레도, 아무 것도 안 하고 싶어. 한 며칠 동안은 계속 아무 것도 안하려고. 아. 과제가 있을 때 내가 내일부터 연속으로 최대 며칠동안 놀 수 있는지 궁금하다. 궁금하긴 한데, 난 아무 것도 안 하고 싶어.
좋은 생각이 났다. 너희가 이걸 대신 구해주면, 내가 너희의 맞은 문제 수를 하나 올려줄게.
입력
첫째 줄에는 과제의 개수인 정수 n (1 ≤ n ≤ 106)이 주어진다.
이후 n개의 줄에 각각의 과제를 나타내는 두 정수 di, ti (1 ≤ di, ti ≤ 109)가 순서대로 주어진다. 오늘은 0일이다.
모든 입력에 대해, 오늘 아무 것도 안 해도 과제를 마무리 할 수 있는 방법이 존재함이 보장된다.
출력
내일(1일)부터 연속으로 최대 며칠 동안 놀 수 있는지를 출력한다. 가령, 답이 0이면, 내일 과제를 해야 하며, 1 이면, 모레에 과제를 해야 한다.
예제 입력 1
3 2 8 1 13 3 10
예제 출력 1
5
힌트
1–5일에는 놀고, 6–7일에는 1번째 과제를, 8–10일에는 3번째 과제를 한다. 11–12일에는 놀고, 13–13 일에 2번째 과제를 한다.
접근 방법
- 0. 주어진 과제를 마무리해야하는 시간을 기준으로 내림차순으로 정렬한다.
- 1. 과제를 하나씩 탐색하며 과제를 마무리할 수 있는 시간을 다음과 같이 설정한다.
- min(현재 탐색 중인 과제의 t, 현재까지 저장된 여유시간) - 현재 탐색 중인 과제의 d
- 2. 모든 탐색이 끝난 뒤, 과제를 마무리할 수 있는 최대한 늦은 시간을 출력한다.
코드
# https://www.acmicpc.net/problem/7983
# 접근방법
# 0. 주어진 과제를 마무리해야하는 시간을 기준으로 내림차순으로 정렬한다.
# 1. 과제를 하나씩 탐색하며 과제를 마무리할 수 있는 시간을 다음과 같이 설정한다.
# min(현재 탐색 중인 과제의 t, 현재까지 저장된 여유시간) - 현재 탐색 중인 과제의 d
# 2. 모든 탐색이 끝난 뒤, 과제를 마무리할 수 있는 최대한 늦은 시간을 출력한다.
import sys
input = sys.stdin.readline
n = int(input())
work = [list(map(int, input().split())) for _ in range(n)]
work.sort(key=lambda x: x[1], reverse = True)
spare_time = work[0][1]
for i in range(n):
spare_time = min(work[i][1], spare_time) - work[i][0]
print(spare_time)
'알고리즘 > 그리디' 카테고리의 다른 글
백준 온라인 저지, 그리디 / 23254번: 나는기말고사형인간이야 (파이썬 / 백준 골드문제) (0) | 2021.11.23 |
---|---|
백준 온라인 저지, 그리디 / 1041번: 주사위 (파이썬 / 백준 골드문제) (0) | 2021.11.22 |
백준 온라인 저지, 그리디 / 2513번: 통학버스 (파이썬 / 백준 골드문제) (0) | 2021.11.21 |
백준 온라인 저지, 그리디 / 12904번: A와B (파이썬 / 백준 골드문제) (0) | 2021.11.21 |
백준 온라인 저지, 그리디 / 3088번: 화분부수기 (파이썬 / 백준 골드문제) (0) | 2021.11.20 |