문제 : https://www.acmicpc.net/problem/27313
접근
다이나믹 프로그래밍을 이용해서 풀 수 있다.
하지만, 동시에 볼 수 있는 애니메이션 K의 범위가 100,000이므로 1, 2, 3 더하기 5 문제처럼 모든 경우의 수를 따지면 바로 시간초과다.
주요 아이디어
N개의 애니메이션을 K개씩 볼 수 있을 때, 길이가 가장 긴 애니메이션 부터 K개씩 그룹을 나누어 보는 것이 가장 짧은 시간에 볼 수 있는 방법이다.
다이나믹 테이블(
dp[i]
)는i+1
개의 애니메이션을 볼 수 있는 최소 시간이다.
풀이
우선 애니메이션 리스트(
a
)를 입력받아 정렬해주어야 한다.전체 애니메이션 N까지
range(0, N)
의 반복문을 돌면서 i를 매개 변수로 받는 함수로dp[i]
의 값을 구한다.i+1
개의 애니메이션을 봤을 때i < K
라면dp[i] = a[i]
이다.i >= K
라면,dp[i] = dp[i-K] + a[i]
이다.- 가장 긴 시간부터 4개씩 그룹 짓는 것이 항상 이득이므로 항상
dp[i-4]
에서 자신을 더한 값이dp[i]
가 된다.
- 가장 긴 시간부터 4개씩 그룹 짓는 것이 항상 이득이므로 항상
- return된 값이 애니메이션을 볼 수 있는 시간 M보다 작다면
dp
에 해당 값을 추가한다. M보다 크다면 즉시 반복문을 빠져나오고 답을 출력한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import sys
input = sys.stdin.readline
def get_time(i):
time = 2147000000
if i < K:
return animations[i]
else:
return dp[i-K] + animations[i]
N, M, K = map(int, input().split())
animations = list(map(int, input().split()))
animations.sort()
dp = []
for i in range(N):
time = get_time(i)
if time > M:
break
else:
dp.append(time)
print(len(dp))
This post is licensed under CC BY 4.0 by the author.